1 8 5 0
1 92 10
#include<iostream> #include<string.h> int tot,c[20],n; void search(int cur)//cur控制行 { int i,j; if(cur==n) tot++; else for(i=0;i<n;i++) { int ok=1; c[cur]=i;//i控制列; for(j=0;j<cur;j++) if(c[cur]==c[j]||cur-c[cur]==j-c[j]||cur+c[cur]==j+c[j])//判断行列,左右对角是否符合条件; { ok=0; break; }//不合格跳出到i++; if(ok) search(cur+1); } } int main() { while(scanf("%d",&n)!=EOF) { if(n==0)break; tot=0; search(0);//从0行开始搜索。 printf("%d\n",tot); } return 0; }这个代码提交的时候时间不合格,要打表。。。
#include<iostream> #include<cstring> using namespace std; int vis[20][20],w[12]; int n,tot; void dfs(int x){ int i; if(x == n) tot++; else{ for(i=0;i<n;i++){ if(!vis[0][i] && !vis[1][x+i] && !vis[2][x-i+n])//不同行列对角; { vis[0][i]=vis[1][x+i]=vis[2][x-i+n]=1;//修改全局变量; dfs(x+1); vis[0][i]=vis[1][x+i]=vis[2][x-i+n]=0;//改回来; } } } } int main(){ int j,a; for(j=1;j<=10;j++)//打表,控制在1到10; { tot=0; memset(vis,0,sizeof(vis)); n=j; dfs(0); w[j]=tot; } while(scanf("%d",&a) && a) { printf("%d\n",w[a]); } return 0; }
原文地址:http://blog.csdn.net/u012766950/article/details/37559255