N皇后问题 HDU-2553
zb121 人气:0按照行优先的方式遍历,因为一行只能放置一个元素,所以每一行不需要进行判断是否重复了。。。
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 }
因为某些原因,最终结果需要打表。。。。
加载全部内容