按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。 给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。 每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。
for (int col = 0; col < n; col++) { // 排除不合法选择 if (!isValid(board, row, col)) { continue; } // 做选择 board[row][col] = 'Q'; // 进⼊下⼀行决策 backtrack(board, row + 1); // 撤销选择 board[row][col] = '.'; }
4、看一下皇后们的约束条件:不能同行、不能同列、不能同斜线。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
boolisValid(vector<string>& board, int row, int col){ int n = board.size(); // 检查列是否有皇后互相冲突 for (int i = 0; i < n; i++) { if (board[i][col] == 'Q') returnfalse; } // 检查右上方是否有皇后互相冲突 for (int i = row - 1, j = col + 1; i >= 0 && j < n; i--, j++) { if (board[i][j] == 'Q') returnfalse; } // 检查左上方是否有皇后互相冲突 for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) { if (board[i][j] == 'Q') returnfalse; } returntrue; }
例如:”0.1.2.201” 和 “192.168.1.1” 是 有效 IP 地址,但是 “0.011.255.245”、”192.168.1.312” 和 “192.168@1.1“ 是 无效 IP 地址。 给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 ‘.’ 来形成。你 不能 重新排序或删除 s 中的任何数字。你可以按 任何 顺序返回答案。
// 回溯函数 voidbacktrack(string& s, int startIndex, int pointNum){ // 如果已经找到了 3 个点,且剩余的字符串也是合法的,则将结果加入到 result 中 if (pointNum == 3) { if (isValid(s, startIndex, s.size() - 1)) { result.emplace_back(s); } return; } // 枚举下一个点的位置 for (int i = startIndex; i < s.size(); ++i) { // 如果当前位置是合法的,则在当前位置加入一个点 if (isValid(s, startIndex, i)) { s.insert(s.begin() + i + 1, '.'); ++pointNum; // 继续递归查找下一个点 backtrack(s, i + 2, pointNum); --pointNum; // 将加入的点移除 s.erase(s.begin() + i + 1); } else { // 如果当前位置不合法,则直接退出循环 break; } } }
// 判断字符串 s 中从 start 到 end 位置的子串是否合法 boolisValid(string s, int start, int end){ if (start > end) returnfalse; if (s[start] == '0' && start != end) returnfalse; // 判断字符串中的数字是否合法 int num = 0; for (int i = start; i <= end; ++i) { if (s[i] > '9' || s[i] < '0') { returnfalse; } // 计算字符串对应的数字 num = num * 10 + (s[i] - '0'); if (num > 255) returnfalse; } returntrue; } };