N皇后问题(dfs)
N皇后问题,一个典型的dfs。
http://acm.hdu.edu.cn/showproblem.php?pid=2553
一开始失误了几下,一直超时,最后才知道可以打表,因为n最大才10;打表后就快多了。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 bool a[11], b[22], c[22], vis[11][11]; 6 int d[11]; 7 int ans = 0, n; 8 void dfs(int x){ 9 if(x == n){ 10 ans ++; 11 return; 12 } 13 for(int i = 0; i < n; i ++){ 14 if(a[i] || b[x+i] || c[x-i+n])continue; 15 a[i] = b[x+i] = c[x-i+n] = vis[x][i] = true; 16 dfs(x+1); 17 a[i] = b[x+i] = c[x-i+n] = vis[x][i] = false; 18 } 19 } 20 int main(){ 21 for(int i = 1; i < 11; i ++){ 22 memset(a,false,sizeof(a)); 23 memset(b,false,sizeof(b)); 24 memset(c,false,sizeof(c)); 25 memset(vis,false,sizeof(vis)); 26 ans = 0; 27 n = i; 28 dfs(0); 29 d[i] = ans; 30 } 31 while(~scanf("%d",&n)&&n){ 32 cout << d[n] << endl; 33 } 34 }