标签:递归 int ++ tempChess chess 皇后 col 解法 row
N 皇后问题 递归解法
参考B站小甲鱼数据结构与算法视频
代码中有详细注释
class Solution {
public List<List<String>> solveNQueens(int n) {
List<List<String>> result = new ArrayList<>();
// 初始化一个棋盘
char[][] chess = new char[n][n];
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
chess[i][j] = '.';
// 从第0行开始,递归搜索每一行可以放皇后的位置(0 --> n-1)
NQueens(n, chess, 0, result);
return result;
}
private void NQueens(int n, char[][] chess, int row, List<List<String>> result) {
// 需要一个临时棋盘
char[][] tempChess = new char[n][n];
// 初始化临时棋盘
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
tempChess[i][j] = chess[i][j];
// 递归出口
if (row == n) { // 所有行都搜索完了(0 --> n-1)
List<String> temp = new ArrayList<>();
for (char[] line : tempChess)
temp.add(new String(line));
result.add(temp);
return;
}
// 遍历row行的每一个位置判断是否可以放置皇后
for (int col = 0; col < n; ++col) {
if (isSafe(n, tempChess, row, col)) { // 如果安全
for (int j = 0; j < n; ++j)
tempChess[row][j] = '.'; // 那么这一行的其余位置全部放'.'
tempChess[row][col] = 'Q'; // 而这个位置放一个皇后
NQueens(n, tempChess, row + 1, result); // 然后递归地搜索下一行
}
}
}
private boolean isSafe(int n, char[][] chess, int row, int col) {
// 因为是从上往下一行一行地放,所以只要检查正上、左上、右上
// 判断列是否有危险
for (int i = 0; i < row; ++i) if (chess[i][col] == 'Q') return false;
// 判断左上对角线是否有危险
for (int i = row, j = col; i >= 0 && j >= 0; --i, --j) if (chess[i][j] == 'Q') return false;
// 判断右上对角线是否有危险
for (int i = row, j = col; i >= 0 && j < n; --i, ++j) if (chess[i][j] == 'Q') return false;
// 都没有危险则安全
return true;
}
}
标签:递归,int,++,tempChess,chess,皇后,col,解法,row 来源: https://blog.csdn.net/qq_41868937/article/details/115386661
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。