HDU ACM 2553 N皇后问题(深搜DFS)
http://acm.hdu.edu.cn/showproblem.php?pid=2553
用暴力的方法 , 二维数组米字型标记
注意:标记恢复时会有重复的标记,所以标记时不能用used[x][y] == 1 要用 used[x][y]++
即使只有1~10,10种数据但是这题输入的数据也非常多 所以要把数据用数组保存起来.
View Code
1 #include <iostream> 2 using namespace std; 3 const int MAX = 10 + 5; 4 int used[MAX][MAX]; 5 int num; 6 int q; 7 void DFS(int n) 8 { 9 if(n - q == 1) 10 { 11 num++; 12 return; 13 } 14 int i; 15 int j; 16 int k; 17 for(i=1;i<=q;i++) 18 { 19 if(used[n][i] == 0) 20 { 21 for(j=n;j<=q;j++) 22 { 23 used[j][i]++; 24 } 25 for(j=1;1;j++) 26 { 27 if(n+j <= q) 28 { 29 if(i+j <= q) 30 { 31 used[n+j][i+j]++; 32 } 33 if(i-j > 0) 34 { 35 used[n+j][i-j]++; 36 } 37 } 38 else 39 { 40 break; 41 } 42 } 43 DFS(n+1); 44 for(j=n;j<=q;j++) 45 { 46 used[j][i]--; 47 } 48 for(j=1;1;j++) 49 { 50 if(n+j <= q) 51 { 52 if(i+j <= q) 53 { 54 used[n+j][i+j]--; 55 } 56 if(i-j > 0) 57 { 58 used[n+j][i-j]--; 59 } 60 } 61 else 62 { 63 break; 64 } 65 } 66 } 67 } 68 return; 69 } 70 int main() 71 { 72 int mark[11]; 73 int i; 74 for(i=1;i<11;i++) 75 { 76 q = i; 77 memset(used,0,sizeof(used)); 78 num = 0; 79 DFS(1); 80 mark[i] = num; 81 } 82 while(cin>>q,q) 83 { 84 85 cout<<mark[q]<<endl; 86 } 87 return 0; 88 }