题意:就是问任意两个点之间不在同一行、不在同一列、两点的连线不能与正方形的边成45度角总共有多少种方法。
思路:一般的深搜题,但要注意两点的连线不能与正方形的边成45度角,坑爹的是用深搜编出来之后我提交了竟然是超时,后来想想完全可以打表啊!!
代码实现:
超时代码,用的是基本的深搜,能够得出结果,用于后面的打表
#include<stdio.h> #include<string.h> int sum,n,visited[15],flag1[25],flag2[25]; void dfs(int i,int num) { int j; if(num==n) sum++; else { for(j=1;j<=n;j++) { if(visited[j]==0&&flag1[i+j]==0&&flag2[n-i+1+j]==0) { num++; visited[j]=-1; flag1[i+j]=-1; flag2[n-i+1+j]=-1; dfs(i+1,num); visited[j]=0; flag1[i+j]=0; flag2[n-i+1+j]=0; num--; } } } } int main() { while(scanf("%d",&n)!=EOF&&n) { sum=0; memset(visited,0,sizeof(visited)); memset(flag1,0,sizeof(flag1)); memset(flag2,0,sizeof(flag2)); dfs(1,0); printf("%d\n",sum); } return 0; }
打表代码:
#include<stdio.h> int main() { int a[11]={0,1,0,0,2,10,4,40,92,352,724},n; while(scanf("%d",&n)!=EOF&&n) { printf("%d\n",a[n]); } return 0; }