LeetCode 51 N皇后
LeetCode51 N皇后
题目描述
n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

上图为 8 皇后问题的一种解法
给定一个整数 n,返回所有不同的 n 皇后问题的解决方案
每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。
样例
输入:4
输出:[
[".Q..", // 解法 1
"...Q",
"Q...",
"..Q."],
["..Q.", // 解法 2
"Q...",
"...Q",
".Q.."]
]
解释: 4 皇后问题存在两个不同的解法
算法分析
- 同一行、同一列、同主对角线、副对角线

时间复杂度
Java代码
class Solution {
static int N = 20;
static boolean[] col = new boolean[N];
static boolean[] dg = new boolean[2*N - 1];
static boolean[] udg = new boolean[2*N -1];
static char[][] g = new char[N][N];
static List<List<String>> ans = new ArrayList<List<String>>();
static void dfs(int y, int n){
if(y == n){
List<String> t = new ArrayList<String>();
for(int i = 0; i < n; i ++){
String temp = "";
for(int j = 0; j < n; j ++){
temp += g[i][j];
}
t.add(temp);
}
ans.add(t);
return;
}
//一行中枚举的每一列
for(int x = 0; x < n; x++){
if(!col[x]&&!dg[y-x+n]&&!udg[y+x]){
col[x] = dg[y-x+n] = udg[y+x] = true;
g[y][x] = 'Q';
dfs(y+1,n);
col[x] = dg[y-x+n] = udg[y+x] = false;
g[y][x] = '.';
}
}
}
public List<List<String>> solveNQueens(int n) {
ans.clear();
for(int i = 0; i < n; i ++){
for(int j = 0; j < n; j ++){
g[i][j] = '.';
}
}
dfs(0,n);
return ans;
}
}

浙公网安备 33010602011771号