加载中...

P1219 [USACO1.5]八皇后 Checker Challenge

[P1219 USACO1.5]八皇后 Checker Challenge - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

思路:

  1. dfs
  2. 回溯
  3. 直到找到所有的可能

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;
			}
		}
	}
}
posted @ 2023-03-12 17:40  ChuenSan  阅读(22)  评论(0)    收藏  举报