http://acm.hdu.edu.cn/showproblem.php?pid=2553
1 8 5 0
1 92 10
我的代码:
#include <string.h> #include <stdio.h> #include <iostream> #include <string.h> using namespace std; int n,cnt; bool dis[11]; int a[11][11]; int ok(int xx,int yy) { int x=xx; int y=yy; while(x<=n&&y<=n) { if(a[x][y]) return 0; x++; y++; } x=xx; y=yy; while(x>0&&y>0) { if(a[x][y]) return 0; x--; y--; } x=xx; y=yy; while(x>0&&y<=n) { if(a[x][y]) return 0; x--; y++; } x=xx; y=yy; while(x<=n&&y>0) { if(a[x][y]) return 0; x++; y--; } return 1; } int dfs(int x,int y) { if(y==n) { cnt++; return 0; } for(int i=x;i<=n;i++) for(int j=1;j<=n;j++) if(ok(i,j)&&!dis[j]&&!a[i][j]) { a[i][j]=1; dis[j]=true; dfs(i+1,y+1); a[i][j]=0; dis[j]=false; } } int main() { int sum[12]; for(int i=1;i<11;i++) { memset(dis,0,sizeof(dis)); n=i; cnt=0; dfs(1,0); sum[i]=cnt; } int x; while(~scanf("%d",&x)&&x) { printf("%d\n",sum[x]); } return 0; }
#include<stdio.h> #include<string.h> int cnt,n; int q[15][15]; int Judge(int x,int y) { for(int i=0;i<n;i++) if(q[x][i] && i!=y) return 0; for(int i=0;i<n;i++) if(q[i][y] && i!=x) return 0; for(int i=x+1,j=y+1;i<n && j<n;i++,j++) if(q[i][j]) return 0; for(int i=x-1,j=y-1;i>=0 && j>=0;i--,j--) if(q[i][j]) return 0; for(int i=x+1,j=y-1;i<n && j>=0;i++,j--) if(q[i][j]) return 0; for(int i=x-1,j=y+1;i>=0 && j<n;i--,j++) if(q[i][j]) return 0; return 1; } void dfs(int c) { if(c==n){ cnt++;return;} for(int i=0;i<n;i++)//皇后肯定是一行一个,一列一个,可以理解为第i行放第i个皇后 if(Judge(i,c)){ q[i][c]=1; dfs(c+1); q[i][c]=0; } } int main(void) { int a[15]={0};//不打表会超时 for(int i=1;i<11;i++){ n=i; cnt=0; memset(q,0,sizeof(q)); dfs(0); a[i]=cnt; } while(scanf("%d",&n)!=EOF && n) { printf("%d\n",a[n]); } return 0; }