按照行優先的方式周遊,因為一行隻能放置一個元素,是以每一行不需要進行判斷是否重複了。。。
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 }
因為某些原因,最終結果需要打表。。。。