Hdu2553 N皇后问题 【简单dfs】
2013-03-28 23:42
316 查看
http://acm.hdu.edu.cn/showproblem.php?pid=2553
经典的N皇后问题。
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
直接dfs。
经典的N皇后问题。
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
直接dfs。
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <vector> #include <set> #include <map> #include <cmath> #include <queue> using namespace std; template <class T> void checkmin(T &t,T x) {if(x < t) t = x;} template <class T> void checkmax(T &t,T x) {if(x > t) t = x;} template <class T> void _checkmin(T &t,T x) {if(t==-1) t = x; if(x < t) t = x;} template <class T> void _checkmax(T &t,T x) {if(t==-1) t = x; if(x > t) t = x;} typedef pair <int,int> PII; typedef pair <double,double> PDD; typedef long long ll; #define foreach(it,v) for(__typeof((v).begin()) it = (v).begin(); it != (v).end ; it ++) const int N = 22; int a , b , c ; int n , ans; void dfs(int dep , int n) { if(dep > n) { ans ++; return; } for(int i=1;i<=n;i++) { if(a[i] || b[i-dep+n] || c[i+dep]) continue; a[i] = b[i-dep+n] = c[i+dep] = 1; dfs(dep+1 , n); a[i] = b[i-dep+n] = c[i+dep] = 0; } } int an ; int main() { memset(an , -1, sizeof(an)); while(~scanf("%d",&n) && n) { if(an != -1) { printf("%d\n" ,an ); continue; } memset(a , 0 ,sizeof(a)); memset(b , 0, sizeof(b)); memset(c ,0 , sizeof(c)); ans = 0; dfs(1,n); printf("%d\n" , an = ans); } return 0; }
相关文章推荐
- hdu2553 n皇后问题 dfs搜索 记忆化
- HDU 2553 N皇后问题 DFS 简单题
- hdu2553 N皇后问题--DFS
- HDU 2553 N皇后问题 (简单DFS入门)
- 初学DFS搜索,N皇后问题,简单易懂
- N皇后问题(hdu2553,dfs+打表)
- 【DFS】HDU2553N皇后问题
- hdu2553 N皇后问题(回溯dfs)
- HDU2553 N皇后问题---(dfs)
- HDU2553-N皇后问题(DFS)
- HDU2553——N皇后问题(dfs)
- hdu N皇后问题 (简单DFS)
- HDU2553:N皇后问题(DFS)
- N皇后问题hdu2553(dfs)
- HDU2553 - N皇后问题 - 经典dfs+打表过
- 蓝桥杯 基础练习 2n皇后问题 (简单dfs暴力+优化剪枝)
- n皇后问题(简单dfs)
- hdu2553-N皇后问题 DFS
- DFS hdu2553 N皇后问题
- ACM: dfs题 poj 1321 (n皇后问题)