N皇后问题,经典
/* * ===================================================================================== * * Filename: 2553.c * Version: 1.0 * Created: 2013年11月23日 15时42分08秒 * Revision: none * Compiler: gcc * Author: Wenxian Ni (Hello World~), niwenxianq@qq.com * Organization: AMS/ICT * Description: N皇后问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 6405 Accepted Submission(s): 2913 Problem Description 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。 你的任务是,对于给定的N,求出有多少种合法的放置方法。 Input 共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。 Output 共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。 Sample Input 1 8 5 0 Sample Output 1 92 10 * * ===================================================================================== */ #include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <cstring> #include <string> #include <algorithm> #include <vector> #include <set> #include <map> #include <queue> #include <stack> using namespace std; /* freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); */ int visit[11];//标记每一列 int maps[11];//maps[i]表示第i行第maps[i]列放置一个皇后 int xh[11]; int ans;//记录有多少种放发 void dfs(int k,int n)//第k行 { int i,j,flag; if(k==n+1)//已经放完了n行 { ans++; return ; } for(i=1;i<=n;i++)//第i列 { if(visit[i]==0) { maps[k]=i; flag=0; for(j=1;j<k;j++)//判断第k个位置是否和前k-1个位置在对角线上面 if((maps[k]-maps[j])==(k-j)||(maps[j]-maps[k])==(k-j)) { flag=1; break; } if(flag==0)//如果没有和前k-1个在对角线上 { visit[i]=1; dfs(k+1,n); visit[i]=0;//这个地方记住要修改过来 } } } } int main() { int i,j,n; for(i=1;i<=10;i++) { memset(visit,0,sizeof(visit)); memset(maps,0,sizeof(maps)); ans=0; dfs(1,i);//一行一行的放,从第一行放到第i行 xh[i]=ans; } while(cin>>n&&n) { cout<<xh[n]<<endl; } return 520; }