题目1254:N皇后问题(DFS)
2014-05-27 23:20
239 查看
题目描述:
N皇后问题,即在N*N的方格棋盘内放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在同一斜线上。因为皇后可以直走,横走和斜走如下图)。
你的任务是,对于给定的N,求出有多少种合法的放置方法。输出N皇后问题所有不同的摆放情况个数。
输入:
输入包含多组测试数据。
每组测试数据输入一个整数n(3<n<=13),表示有n*n的棋盘,总共摆放n个皇后。
输出:
对于每组测试数据,输出总共不同的摆放情况个数,结果单独一行。
样例输入:
样例输出:
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(); } } }
相关文章推荐
- HDOJ 题目2553 N皇后问题(dfs)
- 【LeetCode】N-Queens II && 【九度】题目1254:N皇后问题
- 题目1254:N皇后问题
- hdu 2553 N皇后问题 (DFS)
- hdu 2553 N皇后问题 (经典DFS)
- Hdu2553 N皇后问题 【简单dfs】
- HDU 2553 N皇后问题( DFS + 剪枝 )
- N皇后问题(DFS)
- HDU2553-N皇后问题(DFS)
- 【DFS】hdu 2553 N皇后问题
- dfs棋盘问题,皇后 POJ1321
- N皇后问题hdu2553(dfs)
- POJ 1321 棋盘问题类似八皇后 dfs搜索
- hdu 2553 N皇后问题(dfs)
- N皇后问题(hdu2553,dfs+打表)
- hdu 2553 N皇后问题 (经典DFS)
- HDU ACM 2553 N皇后问题(深搜DFS)
- HDU 2553 N皇后问题(DFS+打表)
- HDU 2553 N皇后问题(DFS)
- 回溯法 N皇后问题 hud题目2553