标签:
http://acm.hdu.edu.cn/showproblem.php?pid=2553
i表示行,map[i]表示列,然后用DFS遍历回溯
可以参考这篇文章:
http://blog.csdn.net/cambridgeacm/article/details/7703739
1 #include <iostream> 2 #include <string> 3 #include <cstring> 4 #include <cstdlib> 5 #include <cstdio> 6 #include <cmath> 7 #include <algorithm> 8 #include <stack> 9 using namespace std; 10 11 #define MEM(a,b) memset(a,b,sizeof(a)) 12 13 bool used[15]; 14 //i表示行,map[i]表示列 15 int map[15]; 16 int sol[15]; 17 18 int ans,n; 19 20 21 void dfs(int k) 22 { 23 int i,j; 24 25 //判断末尾 26 if(k==n+1) 27 { 28 ans++; 29 return; 30 } 31 32 for(i = 1;i<=n;i++) 33 { 34 if(!used[i]) 35 { 36 map[k] = i; 37 bool flag = true; 38 39 //是否在一条斜线上 40 for(j=1;j<=k-1;j++) 41 { 42 if((map[k]-map[j])==(k-j) || (map[k]-map[j])==(j-k)) 43 { 44 flag = false; 45 break; 46 } 47 } 48 if(flag) 49 { 50 used[i] = true; 51 dfs(k+1); 52 //没找到,释放used 53 //回溯 54 used[i] = false; 55 } 56 } 57 } 58 } 59 60 61 int main() 62 { 63 int t,i; 64 //保存是因为后台可能有重复的数据,单次来说效率是一样的 65 for(i = 1;i<=10;i++) 66 { 67 MEM(used,false); 68 MEM(map,0); 69 n = i; 70 ans = 0; 71 dfs(1); 72 sol[i] = ans; 73 } 74 75 while (~scanf("%d",&n) && n) 76 { 77 printf("%d\n",sol[n]); 78 } 79 return 0; 80 }
标签:
原文地址:http://www.cnblogs.com/qlky/p/5020872.html