hdu2553(深搜+打表)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<iostream> 2 using namespace std; 3 int a[11]={0,1,0,0,2,10,4,40,92,352,724}; 4 int main() 5 { 6 int n; 7 while(scanf("%d",&n)>0&&n) 8 { 9 printf("%d\n",a[n]); 10 } 11 return 0; 12 }
思路:由于题目数据量小,只有10个数据,可以用深搜搜索出来后,打表。
深搜代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<iostream> 2 #include<math.h> 3 using namespace std; 4 int s[12][12],n,count; 5 int panduan(int h,int l) 6 { 7 for(int i=0;i<n;i++) //判断列 8 { 9 if(s[i][l]==0||i==h) 10 continue; 11 else 12 return 0; 13 } 14 for(i=0;i<n;i++) //判断行 15 { 16 if(s[h][i]==0||i==l) 17 continue; 18 else 19 return 0; 20 } 21 for(i=0;i<n;i++) //判断成45度的线 22 { 23 for(int j=0;j<n;j++) 24 { 25 if(s[i][j]==0||(i==h&&j==l)) 26 continue; 27 else 28 { 29 if(abs(h-i)==abs(l-j)) //只要y=kx+b中abs(k)==1,说明成了45度的线 30 return 0; 31 } 32 } 33 } 34 return 1; 35 } 36 void dfs(int num,int f) 37 { 38 int i,j; 39 if(num==n*n) 40 { 41 if(f==0) 42 count++; 43 return; 44 } 45 if(num>n*n)return; 46 i=num/n; 47 j=num%n; 48 if(s[i][j]==0&&panduan(i,j)) 49 { 50 s[i][j]=1; 51 dfs(num+1,f-1); 52 s[i][j]=0; 53 } 54 dfs(num+1,f); 55 } 56 int main() 57 { 58 while(scanf("%d",&n)>0&&n) 59 { 60 memset(s,0,sizeof(s)); 61 count=0; 62 dfs(0,n); 63 //printf("\n\n"); 64 printf("%d\n",count); 65 } 66 return 0; 67 }
打表代码:
#include<iostream> using namespace std; int a[11]={0,1,0,0,2,10,4,40,92,352,724}; int main() { int n; while(scanf("%d",&n)>0&&n) { printf("%d\n",a[n]); } return 0; }
朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。