洛谷 P1219 [USACO1.5]八皇后 Checker Challenge(Java版)
Posted ZSYL
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷 P1219 [USACO1.5]八皇后 Checker Challenge(Java版)相关的知识,希望对你有一定的参考价值。
题目描述
输入格式
一行一个正整数 n,表示棋盘是 n×n 大小的。
输出格式
前三行为前三个解,每个解的两个数字之间用一个空格隔开。第四行只有一个数字,表示解的总数。
输入输出
输入
6
输出
2 4 6 1 3 5
3 6 2 5 1 4
4 1 5 2 6 3
4
参考代码
注意:对角线right[i-j]
后面必须加上一个n
,因为i-j
可能为负数,那么数组就会报错,所以将整体向右偏移n
个单位(坐标偏移不会影响我们需要达到的目的),将所有可能变成正数;(因为i-j
的最小值是-n+1
,所以加上一个n
就一定会变成一个正数)
本道题最重要的就是记录下皇后占领的格子(打标记的思想),通过此判断下一个皇后是否可以在某个位置,如果可以,则继续搜索下一个皇后可以在的位置,如果不行,则清除标记回到上一步,继续搜索;
需要注意:数组可以开大一点
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
public class n_皇后 {
static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
static int n, res_sum;
static int[] res = new int[14]; // 存储答案
static int[] col = new int[14]; // 标记列占位
static int[] right = new int[28]; // 标记右对角线:x-y差值不变
static int[] left = new int[28]; // 标记左对角线:x+y相加相同
public static void main(String[] args) {
n = nextInt();
res_sum = 0;
dfs(1);
System.out.println(res_sum);
}
public static void dfs(int r) {
// 递归结束条件
if (r == n+1) {
// 输出前三个结果
if (res_sum < 3) {
for (int i = 1; i <= n; i++) {
System.out.print(res[i] + " ");
}
System.out.println();
}
res_sum++;
return;
}
// 遍历每一列
for (int c = 1; c <= n; c++) {
// right[x-y+N]:+N是避免负数,报错
if (col[c] == 0 && right[r-c+n] == 0 && left[r+c] == 0) { // 判断有无皇后
// 标记
res[r] = c; // 标记第r行第c列放一个皇后
col[c] = 1; // 占领c列
// 占领双对角线
right[r-c+n] = 1;
left[r+c] = 1;
// 往下一列搜索
dfs(r+1);
// 回溯,清楚标记
col[c] = 0;
right[r-c+n] = 0;
left[r+c] = 0;
}
}
}
static int nextInt() {
try {
in.nextToken();
} catch (IOException e) {
e.printStackTrace();
}
return (int)in.nval;
}
}
加油!
感谢!
努力!
以上是关于洛谷 P1219 [USACO1.5]八皇后 Checker Challenge(Java版)的主要内容,如果未能解决你的问题,请参考以下文章