AcWing 843. n-皇后问题
原题链接
中等
dfs又一经典例题,用全排列的思路解决
import java.util.*;
public class Main {
static int n;
static int N = 10;
static boolean[] col = new boolean[N]; // 每一列
static boolean[] dg = new boolean[N * 2]; // 对角线、反对角线个数会多一些
static boolean[] udg = new boolean[N * 2]; // 反对角线
static char[][] g = new char[N][N]; // 存储棋盘
private static void dfs(int u) { // 以全排列的思路想n皇后问题
if (u == n) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) System.out.print(g[i][j]);
System.out.println();
}
System.out.println();
} else {
for (int i = 0; i < n; i++) {
if (!col[i] && !dg[u + i] && !udg[n - u + i - 1]) { // 只有在该列、对角线、斜对角线都没有皇后时,才放上去
g[u][i] = 'Q';
col[i] = true;
dg[u + i] = true;
udg[n - u + i - 1] = true;
dfs(u + 1);
// 恢复现场
col[i] = false;
dg[u + i] = false;
udg[n - u + i - 1] = false;
g[u][i] = '.';
}
}
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
g[i][j] = '.';
dfs(0);
}
}