-
题目描述:
-
N皇后问题,即在N*N的方格棋盘内放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在同一斜线上。因为皇后可以直走,横走和斜走如下图)。
你的任务是,对于给定的N,求出有多少种合法的放置方法。输出N皇后问题所有不同的摆放情况个数。
-
输入:
-
输入包含多组测试数据。
每组测试数据输入一个整数n(3<n<=13),表示有n*n的棋盘,总共摆放n个皇后。
-
输出:
-
对于每组测试数据,输出总共不同的摆放情况个数,结果单独一行。
-
样例输入:
-
4
-
样例输出:
-
2
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.PrintWriter;
import java.io.OutputStreamWriter;
import java.io.StreamTokenizer;
import java.util.Arrays;
class Main
{
public static final boolean DEBUG = false;
public static int N = 30;
public BufferedReader cin;
public PrintWriter cout;
public StreamTokenizer tokenizer;
public int n;
public boolean[][] vis;
public int ans;
public void init()
{
try {
if (DEBUG) {
cin = new BufferedReader(new InputStreamReader(
new FileInputStream("d:\\OJ\\uva_in.txt")));
} else {
cin = new BufferedReader(new InputStreamReader(System.in));
}
cout = new PrintWriter(new OutputStreamWriter(System.out));
tokenizer = new StreamTokenizer(cin);
} catch (Exception e) {
e.printStackTrace();
}
}
public String next()
{
try {
tokenizer.nextToken();
if (tokenizer.ttype == StreamTokenizer.TT_EOF)
return null;
else if (tokenizer.ttype == StreamTokenizer.TT_NUMBER) {
return String.valueOf((int) tokenizer.nval);
}
return null;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public boolean input()
{
String s = next();
if (s == null) return false;
n = Integer.parseInt(s);
if (n == 0) return false;
vis = new boolean[3][N];
return true;
}
public void dfs(int cur)
{
if (cur == n) {
ans++;
return;
}
for (int i = 0; i < n; i++) {
if (vis[0][i] || vis[1][i - cur + n - 1] || vis[2][i + cur]) continue;
vis[0][i] = vis[1][i - cur + n - 1] = vis[2][i + cur] = true;
dfs(cur + 1);
vis[0][i] = vis[1][i - cur + n - 1] = vis[2][i + cur] = false;
}
}
public void solve()
{
ans = 0;
for (int i = 0; i < 3; i++) {
Arrays.fill(vis[i], false);
}
dfs(0);
cout.println(ans);
cout.flush();
}
public static void main(String[] args)
{
Main solver = new Main();
solver.init();
while (solver.input()) {
solver.solve();
}
}
}