天天看点

N皇后问题 HDU-2553

按照行优先的方式遍历,因为一行只能放置一个元素,所以每一行不需要进行判断是否重复了。。。

1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<cstdio>
 5 using namespace std;
 6 const int maxn=10086;
 7 int a[maxn];
 8 int cnt;
 9 int n;
10 void dfs(int row,int &cnt){
11     if(row==n){//递归终止条件
12         cnt++;
13         return;
14     }
15     for(int col=0;col<n;col++){//col表示的是列
16         int ok=1;
17         for(int j=0;j<row;j++){//row行之前,均需要判断是否符合规定
18             if(a[j]==col||abs(col-a[j])==abs(row-j)){
19                 ok=0;
20                 break;
21             }
22         }
23         if(ok){
24             a[row]=col;//表示的是第col列可以放置在row行上面。
25             dfs(row+1,cnt);//向下一行进行探索,这样就可以保证每一行只放一个元素,这样就不用行都进行判断。
26         }
27     }
28 }
29 int main(){
30     //int n;
31     int ans[11];
32     for(n=1;n<=10;n++){
33         cnt=0;
34         dfs(0,cnt);//每一次都是从0行开始进行探索
35         ans[n]=cnt;
36     }
37     for(int i=1;i<=10;i++){
38         cout<<ans[i]<<" ";
39     }
40     cout<<endl;
41 //    while(cin>>n){
42 //        cnt=0;
43 //        dfs(0,cnt);
44 //        cout<<cnt<<endl;
45 //    }
46     
47     return 0;
48 }      

因为某些原因,最终结果需要打表。。。。