P1219 [USACO1.5]八皇后 Checker Challenge
[P1219 USACO1.5]八皇后 Checker Challenge - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
思路:
- dfs
- 回溯
- 直到找到所有的可能
AC代码
public class P1219 {
static int n;
// 对 check 数组做以下说明
// check[0] 标记相应的列有没有被使用
// check[1] 和 check[2] 都是对对角线进行的标记
static int[][] check = new int[3][30];
static int[] ans; // 结果数组
static int count = 0;// 记录结果总个数
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();
ans = new int[n + 1];
dfs(1);
System.out.println(count);
}
/**
* @param l 行
*/
private static void dfs(int l) {
if (l > n) {
count++;
if (count > 3) {
return;
}
for (int i = 1; i < ans.length; i++) {
System.out.printf("%d ", ans[i]);
}
System.out.println();
return;
}
for (int i = 1; i <= n; i++) {
// 这里用 check 数组对另一条对角线进行标记的时候并不是简单的减法,
// 因为数组中用减法容易导致数组下标越界,可以采用绝对值的方法等等,这里直接加 n 也可以
// 这里也算一点小技巧吧,小细节
if (check[0][i] == 0 && check[1][l + i] == 0 && check[2][l - i + n] == 0) {
ans[l] = i;
check[0][i] = 1;
check[1][l + i] = 1;
check[2][l - i + n] = 1;
dfs(l + 1);// 换行
// 回溯
ans[l] = 0;
check[0][i] = 0;
check[1][l + i] = 0;
check[2][l - i + n] = 0;
}
}
}
}