代码随想录算法训练营第30天| 332.重新安排行程 、51. N皇后 、 37. 解数独

332.重新安排行程

开始想的是将行程进行全排列之后,然后选出一个字典排序最小的。就也是使用的回溯的思路。

class Solution {
private:vector<vector<string>> res;vector<string> path;int ticketUsed = 0;bool cmp(const vector<string> &a, const vector<string> &b) {for (int i = 0; i < b.size(); ++i) {if (a[i] == b[i]) continue; //跳出循环return a[i] < b[i] ? true : false;}return false;}void backtracking(vector<vector<string>> &tickets, vector<bool>& used, string airport) {if (ticketUsed == tickets.size()) {res.push_back(path);return;}for (int i = 0; i < tickets.size(); i++) {if (tickets[i][0] == airport && used[i] == false) {used[i] = true;ticketUsed++;path.push_back(tickets[i][1]);backtracking(tickets, used, tickets[i][1]);used[i] = false;ticketUsed--;path.pop_back();}}}public:vector<string> findItinerary(vector<vector<string>>& tickets) {vector<bool> used(tickets.size(), false);path.push_back("JFK");backtracking(tickets, used, "JFK");sort(res.begin(), res.end(), cmp);return res[0];}
};

使用了其他的数据结构进行去重

class Solution {
private:// unordered_map<出发机场, map<到达机场, 航班次数>> targetsunordered_map<string, map<string, int> > targets;bool backtracking(int ticketNum, vector<string>& result) {if(result.size() == ticketNum + 1) {return true;}for(pair<const string, int>& target : targets[result[result.size() - 1]]) {if(target.second > 0) {  //记录到达机场是否飞过result.push_back(target.first);target.second--;if(backtracking(ticketNum, result)) return true;result.pop_back();target.second++;}}return false;}
public:vector<string> findItinerary(vector<vector<string> >& tickets) {targets.clear();vector<string> res;for(const vector<string>& vec : tickets) {targets[vec[0]][vec[1]]++;}res.push_back("JFK");  //起始机场backtracking(tickets.size(), res);return res;}
};

51. N皇后

本题是使用回溯法的经典问题。

里面有一步就是验证放了之后,是否有冲突。 因为是从上往下一层层的在填充,所以就不用考虑 更下一层是否会有皇后。而且,也不需要考虑行

bool inValid(int row, int col, vector<string>& chessboard, int n) {// 检查列for (int i = 0; i < row; ++i) {if (cheese[i][col] == 'Q')return false;}// 135° 检查是否有皇后for (int i = row - 1, j = col - 1; i >=0 && j >= 0; --i, --j) {if (cheese[i][col] == 'Q')return false;}// 45°检查是否有皇后for (int i = row - 1, j = col + 1; i >= 0 && j <= n -1; --i, ++j) {if (cheese[i][col] == 'Q')return false;}return true;
}
class Solution {
private:vector<vector<string> > result;void backtracking(int n, int row, vector<string>& chessboard) {if(row == n) {result.push_back(chessboard);return;}for (int col = 0; col < n; col++) {if (isValid(row, col, chessboard, n)) { // 验证合法就可以放chessboard[row][col] = 'Q'; // 放置皇后backtracking(n, row + 1, chessboard);chessboard[row][col] = '.'; // 回溯,撤销皇后}}}bool isValid(int row, int col, vector<string>& chessboard, int n) {//检查列for(int i = 0; i < row; i++) {if(chessboard[i][col] == 'Q') {return false;}}//135° 检查是否有皇后for(int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) {if(chessboard[i][j] == 'Q') {return false;}}//45°检查是否有皇后for(int i = row - 1, j = col + 1; i >= 0 && j < n; i--, j++) {if(chessboard[i][j] == 'Q') {return false;}}return true;
}
public:vector<vector<string> > solveNQueens(int n) {result.clear();vector<string> chessboard(n, string(n, '.'));backtracking(n, 0, chessboard);return result;}
};

37. 解数独

在看了n皇后之后,再看数独,这种填充问题,感觉就是得用回溯法。

横向的for循环来控制要填什么,纵向的递归就是在寻找一个可以填的空位。

class Solution {
private:bool isValid(int row, int col, char val, vector<vector<char>>& board) {// 一行里面是否有重复for (int i = 0; i < 9; ++i) {if (board[row][9] == val)return false;}// 一列里面是否有重复for (int i = 0; i < 9; ++i) {if (board[i][col] == val)return false;}// 判断九方格里面是否有重复int startRow = (row / 3) * 3;int startCol = (col / 3) * 3;for (int i = startRow; i < startRow + 3; ++i) {for (int j = startCol; j < startCol + 3; ++j) {if (board[i][j] == val)return false;}}return true;}bool backtracking(vector<vector<char>>& board) {// 要遍历完整个树,所以不设置终止条件for (int i = 0; i < board.size(); ++i) {for (int j = 0; j < board.size(); ++j) {if (board[i][j] == '.') {for (char k = '1'; k <= '9'; ++k) {if (isValid(i, j, k, board)) {board[i][j] = k;if (backtracking(board) == true)return true;board[i][j] = '.'; //回溯}}// 9个数字都不行return false;}}}return true;}
public:void solveSudoku(vector<vector<char>>& board) {backtracking(board);}
};

代码随想录算法训练营第30天| 332.重新安排行程 、51. N皇后 、 37. 解数独相关推荐

  1. 代码随想录刷题|LeetCode 332.重新安排行程 51. N皇后 37. 解数独

    目录 332.重新安排行程 思路 重新安排行程 51. N皇后 思路 N皇后 37. 解数独 思路 解数独         这三道题目都是困难题目,都是根据代码随想录的思路总结书写,慢慢理解,慢慢熟练 ...

  2. 代码随想录算法训练营第30天 | 51. N皇后 37.解数独 332.重新安排行程 回溯篇小结

    代码随想录系列文章目录 回溯篇 - 棋盘问题 图的dfs 文章目录 代码随想录系列文章目录 51.N皇后 37.解数独 332.重新安排行程 回溯篇小结 51.N皇后 题目链接 这道题的思路是什么样的 ...

  3. 代码随想录算法训练营第⑦天 | 454.四数相加II ,383. 赎金信,15. 三数之和,18. 四数之和 9.30

    代码随想录算法训练营第⑦天 | 454.四数相加II ,383. 赎金信,15. 三数之和,18. 四数之和 9.30 454.四数相加II 可以先用2次for循环遍历前两个数组a,b 并存储到map ...

  4. _32LeetCode代码随想录算法训练营第三十二天-贪心算法 | 738.单调递增的数字 、714.买卖股票的最佳时机含手续费、968.监控二叉树

    _32LeetCode代码随想录算法训练营第三十二天-贪心算法 | 738.单调递增的数字 .714.买卖股票的最佳时机含手续费.968.监控二叉树 题目列表 738.单调递增的数字 714.买卖股票 ...

  5. 代码随想录【Day 30】| 332.重新安排行程 、51. N皇后 、37. 解数独

    代码随想录[Day 30] | 332.重新安排行程 .51. N皇后 .37. 解数独 332.重新安排行程 题目链接:332.重新安排行程 卡尔文解 解题思路及注意事项: 代码实现: 51. N皇 ...

  6. 代码随想录算法训练营day42 | 01背包问题,你该了解这些!,01背包问题,你该了解这些! 滚动数组 , 416. 分割等和子集

    代码随想录算法训练营day42 | 背包理论基础,背包理论基础(滚动数组), 416. 分割等和子集 1.01背包理论基础 背包问题概述 01背包 二维dp数组01背包案例 2.01背包理论基础(滚动 ...

  7. 代码随想录算法训练营day1

    代码随想录算法训练营第一天| 704. 二分查找.27. 移除元素. 704.二分查找 题目链接:leetcode704 Binary search 暴力解法: class Solution {pub ...

  8. 代码随想录算法训练营第七天| 哈希表理论基础 ,454.四数相加II, 383. 赎金信, 15. 三数之和, 18. 四数之和

    代码随想录算法训练营第七天| 哈希表理论基础 ,454.四数相加II, 383. 赎金信, 15. 三数之和, 18. 四数之和 454.四数相加II 建议:本题是 使用map 巧妙解决的问题,好好体 ...

  9. 代码随想录算法训练营第二天| 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II。

    代码随想录算法训练营第二天| 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II. 977.有序数组的平方 209. 长度最小的子数组 59. 螺旋矩阵 II 977.有序数组的 ...

最新文章

  1. 推荐系统学习03-SVDFeature
  2. Python自动化开发学习的第十一周----WEB基础(jquery)
  3. 三层学习------实践篇
  4. Mybatis 关键组件(注意各组件的最佳作用域)
  5. jQuery1.9+中删除了live以后的替代方法
  6. 物理太难?这些虚拟动图,让你看懂物理
  7. dynamic_debug动态打印kernel日志
  8. 【APIO2009-3】抢掠计划
  9. 输出空格隔开换行_VB编程(六)数据输出 Print 及相关方法
  10. Spark面试题梳理
  11. 传统梯度下降法面临的挑战
  12. WinRAR4.11激活
  13. JAVA数据库访问控制框架设计与使用
  14. java 微信主动推送消息_java微信主动推送消息,java微信主动推送消息怎么实现?
  15. java近义词,java实现近义词维护
  16. 何香伊的脸儿,战痘经历
  17. 阿卡迪亚大学计算机专业好考吗,考上阿卡迪亚大学有多难?
  18. excel 隔行插入和错位
  19. java批量打印标签_java批量打印
  20. 创建Chinaskills20为GPO管理员;加入到企业管理、域控管理员组;

热门文章

  1. 英文求职信计算机网络,英语求职信
  2. 香港大学 计算机学院 笔试题目,港大计算机 HKU CS面试准备
  3. Houdini Chop 数据chan格式
  4. 网络安全从业者可以考哪些证书?行业认可证书汇总!
  5. 证券公司可以提供免费股票level2接口吗?
  6. 2021-01-14某证券公司后台开发岗位面试记录(三面也是技术终面)
  7. python酒店评论分析_GitHub - jiahuiiii/senti_analysis: 利用Python实现酒店评论的中文情感分析...
  8. Springboot+vue前后端项目的部署和搭建
  9. 熊猫烧香制造者李俊:5个小时完成专杀软件
  10. 在饭店中,厨师需要做十道菜。厨师做好一道菜,就招呼侍者端走,菜还没有端走时,厨师就睡觉。侍者端走菜时把厨师唤醒,厨师做下一道菜。无做好的菜,侍者就睡觉。请编写程序模拟厨师和侍者的合作。(提示:厨师线程