按照行优先的方式遍历,因为一行只能放置一个元素,所以每一行不需要进行判断是否重复了。。。
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 }
因为某些原因,最终结果需要打表。。。。