您的位置:首页 > 其它

题目1254:N皇后问题(DFS)

2014-05-27 23:20 239 查看
题目描述:

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]
;
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();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: