クイーンズJavaの2n個のブルーブリッジカップの訓練基地

クイーンズ2nの基本的な演習

リソースの制約

制限時間:メモリ制限が1.0S:512.0メガバイト

問題の説明

N * Nボードを考えると、ボードは女王のいくつかの位置に置くことはできません。今までブラックボードが配置され、N及びN-クイーンホワイト女王ので、任意の2つの黒いクイーンが同じ行、同じ列または同じ対角線上にないことではなく、同じ列内の任意の2つの白の女王、同じ列や同じ対角線。Q. Aは、どのように多くのプット法の合計しますか?nは8以下です。

入力形式

第一幕入力整数n、ボードのサイズ。
  クイーンことができない放電に対応する位置を示す、0の整数である場合、続いてN行の各行nは0又は1の整数であり、クイーンに対応する位置を示す1の整数である場合、配置することができます。

出力フォーマット

出力アン法律を置く種の合計数を表す整数。

サンプル入力

4
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1

サンプル出力

2

サンプル入力

4
1 0 1 1
1 1 1 1
1 1 1 1
1 1 1 1

サンプル出力

0

参照コード

import java.util.Scanner;

public class Main {
	static int n;
	static int[][] a;
	static int ans = 0;
	static boolean[] b = new boolean[20]; // 标记黑皇后占领的列
	static boolean[] c = new boolean[20]; // 标记黑皇后占领的对角线(左下到右上)
	static boolean[] d = new boolean[20]; // 标记黑皇后占领的对角线(左上到右下)
	static boolean[] b2 = new boolean[20]; // 标记白皇后占领的列
	static boolean[] c2 = new boolean[20]; // 标记白皇后占领的对角线(左下到右上)
	static boolean[] d2 = new boolean[20]; // 标记白皇后占领的对角线(左上到右下)

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();
		a = new int[n + 1][n + 1];
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= n; j++) {
				a[i][j] = sc.nextInt();
			}
		}
		dfs(1);
		System.out.println(ans);
	}

	private static void dfs(int x) {
		if (x == n + 1) {
			ans++;
			return;
		}
		for (int i = 1; i <= n; i++) {
			// 判断该位置是否可以放置黑皇后
			if (a[x][i] == 1 && !b[i] && !c[x + i] && !d[x - i + n]) {
				a[x][i] = 0; //此位置被皇后占领
				b[i] = true; // 此列被黑皇后占领
				c[x + i] = true; // 对角线被黑皇后占领
				d[x - i + n] = true; // 对角线被黑皇后占领 ("+n"防止数组下标为负数)		
				for (int j = 1; j <= n; j++) {
					// 判断该位置是否可以放置白皇后
					if (a[x][j] == 1 && !b2[j] && !c2[x + j] && !d2[x - j + n]) {
						a[x][j] = 0;  //此位置被皇后占领
						b2[j] = true; // 此列被白皇后占领
						c2[x + j] = true; // 对角线被白皇后占领
						d2[x - j + n] = true; // 对角线被白皇后占领 ("+n"防止数组下标为负数)
						dfs(x + 1);
						// 回溯
						a[x][j] = 1;
						b2[j] = false;
						c2[x + j] = false;
						d2[x - j + n] = false;
					}
				}
				// 回溯
				a[x][i] = 1;
				b[i] = false;
				c[x + i] = false;
				d[x - i + n] = false;
			}
		}
	}
}
リリース5元の記事 ウォンの賞賛0 ビュー142

おすすめ

転載: blog.csdn.net/qq_44972405/article/details/104599357