1 8 5 0
1 92 10代码:#include<stdio.h> #include<string.h> #define MAX 100 int visit[3][MAX]; int dp[MAX]; int sum; void dfs(int num,int n)//num代表搜索当前行数 { int i,j; if(num==n+1) sum++; else { for(i=1;i<=n;i++)//遍历每一列 { if(!visit[0][i]&&!visit[1][num+i]&&!visit[2][num-i+n])//若当前列 主对角线 副对角线 都可用 { visit[0][i]=visit[1][num+i]=visit[2][num-i+n]=1; dfs(num+1,n); visit[0][i]=visit[1][num+i]=visit[2][num-i+n]=0; } } } } int main() { int n,i,j; memset(dp,0,sizeof(dp)); for(i=1;i<=10;i++) { sum=0; memset(visit,0,sizeof(visit)); dfs(1,i); dp[i]=sum; } while(scanf("%d",&n)&&(n!=0)) { printf("%d\n",dp[n]); } return 0; }
当然,这里也有个取巧的代码:#include<stdio.h> int a[10]={1,0,0,2,10,4,40,92,352,724}; int main() { while(scanf("%d",&n),n) printf("%d\n",a[n-1]); return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/zhangxiaoxiang123/article/details/47790899