![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.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://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.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;
}