建设校园网站的意义,外汇网站怎么做优化,建筑工程网布设,网站欢迎页设计打卡第30天#xff0c;回溯算法第二刷。 今日任务 332.重新安排行程51.N皇后37.解数独总结 332.重新安排行程 给你一份航线列表 tickets #xff0c;其中 tickets[i] [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。 所有这些机票都属于一个从… 打卡第30天回溯算法第二刷。 今日任务 332.重新安排行程51.N皇后37.解数独总结 332.重新安排行程 给你一份航线列表 tickets 其中 tickets[i] [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。 所有这些机票都属于一个从 JFK肯尼迪国际机场出发的先生所以该行程必须从 JFK 开始。如果存在多种有效的行程请你按字典排序返回最小的行程组合。 例如行程 [“JFK”, “LGA”] 与 [“JFK”, “LGB”] 相比就更小排序更靠前。 假定所有机票至少存在一种合理的行程。且所有的机票 必须都用一次 且 只能用一次。 代码随想录
class Solution {
public:unordered_mapstring, mapstring, int targets;bool backtracking(int ticketNum, vectorstring res) {if(res.size() ticketNum 1) return true;for(pairconst string, int target : targets[res[res.size() - 1]]) {if(target.second 0) {res.push_back(target.first);target.second--;if (backtracking(ticketNum, res)) return true;target.second;res.pop_back();}}return false;}vectorstring findItinerary(vectorvectorstring tickets) {targets.clear();vectorstring res;for(const vectorstring vec: tickets) {targets[vec[0]][vec[1]];}res.push_back(JFK);backtracking(tickets.size(), res);return res;}
};51.N皇后 按照国际象棋的规则皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上并且使皇后彼此之间不能相互攻击。 给你一个整数 n 返回所有不同的 n 皇后问题 的解决方案。 每一种解法包含一个不同的 n 皇后问题 的棋子放置方案该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。 代码随想录
class Solution {
public:vectorvectorstring res;bool isVaild(int row, int col,int n, vectorstring chessborad) {for(int i 0; i row; i) {if(chessborad[i][col] Q) return false;}for(int i row - 1, j col - 1; i 0 j 0; i--, j--) {if(chessborad[i][j] Q) return false;}for(int i row - 1, j col 1; i 0 j n; i--, j) {if(chessborad[i][j] Q) return false;}return true;}void backtarcking(int n, int row, vectorstring chessborad) {if(row n) {res.push_back(chessborad);return;}for(int col 0; col n; col) {if(isVaild(row, col, n, chessborad)) {chessborad[row][col] Q;backtarcking(n, row 1, chessborad);chessborad[row][col] .;}}}vectorvectorstring solveNQueens(int n) {res.clear();vectorstring chessborad(n, string(n, .));backtarcking(n, 0, chessborad);return res;}
};37.解数独 编写一个程序通过填充空格来解决数独问题。 数独的解法需 遵循如下规则 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。请参考示例图 数独部分空格内已填入了数字空白格用 ‘.’ 表示。 代码随想录 一个for循环遍历棋盘的行一个for循环遍历棋盘的列一行一列确定下来之后递归遍历这个位置放9个数字的可能性
class Solution {
public:bool backtracking(vectorvectorchar board) {for(int i 0; i board.size(); i) {for(int j 0; j board.size(); j) {if(board[i][j] ! .) continue;for(char c 1; c 9; c) {if(isValid(board, i, j, c)) {board[i][j] c;if(backtracking(board)) return true;board[i][j] .;}}return false;}}return true;}bool isValid(vectorvectorchar board, int row, int col, char c) {for(int i 0; i 9; i) {if(board[row][i] c) return false;}for(int i 0; i 9; i) {if(board[i][col] c) return false;}for(int i row - (row % 3); i row - (row % 3) 3; i) {for(int j col - (col % 3); j col - (col % 3) 3; j) {if(board[i][j] c) return false;}}return true;}void solveSudoku(vectorvectorchar board) {backtracking(board);}
};