皇后问题(dfs)
一、问题解析
原题链接:https://www.acwing.com/problem/content/845/
国际象棋中的皇后可以横着走、竖着走、斜着走。此题要求每一个皇后都不能互相攻击到。
二、代码实现
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Main {
// 数据范围1~9,由于斜方向的原因,所以给两倍大的数据范围20。
static int N = 20;
// n*n的棋盘
static int n;
//记录“皇后”位置
static String[][] g;
// 列 不重复
static boolean[] col = new boolean[N];
// 正斜 不重复
static boolean[] dg = new boolean[N];
// 反斜 不重复
static boolean[] bdg = new boolean[N];
private static void dfs(int u) {
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();
return;
}
for (int i = 0; i < n; i++) {
//如果col、dg、bdg都是false的话,可以在该位置放置“皇后”
if (!col[i] && !dg[i - u + n] && !bdg[u + i]) {
//标记“皇后”
g[u][i] = "Q";
//将当前列、正斜、反斜标记为已使用
col[i] = true;
dg[i - u + n] = true;
bdg[u + i] = true;
dfs(u + 1);
//清理现场,复原
col[i] = false;
dg[i - u + n] = false;
bdg[u + i] = false;
g[u][i] = ".";
}
}
}
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(reader.readLine());
//先让每个位置都为“.”
g = new String[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
g[i][j] = ".";
}
}
dfs(0);
reader.close();
}
}