hdu 2553 n皇后问题

来源:互联网 发布:淘宝好评评语怎么删除 编辑:程序博客网 时间:2024/05/17 21:44
#include<stdio.h>#include<string.h>#define max 10int map[max][max];int palce[max];int ans[max];/*表示这一行的皇后放在哪一列*/int num;int check(int t,int x,int n){  int i,j,k;  int flag=1;    for(i=0;i<x;i++){if(map[t][i]==1){flag=0;return flag;}  }  for(j=0;j<t;j++){  if(map[j][x]==1)  {  flag=0;  return flag;  }  }  for(k=0;(t-k>=0)&&(x-k)>=0;k++){  if(map[t-k][x-k]==1){  flag=0;  return flag;  }  }  /*  对角线有两边  */  for(k=0;(t-k>=0)&&(x+k)<n;k++){  if(map[t-k][x+k]==1)  {  flag=0;  return flag;  }  }return flag;}void dfs(int t,int n){/*n表示总共有多少个皇后*/int tempx,tempy;if(t==n){num++;/*for(int i=0;i<n;i++){printf("%d ",palce[i]);}printf("\n");*/return ;}for(int i=0;i<n;i++){if(check(t,i,n)==1){palce[t]=i;map[t][i]=1;dfs(t+1,n);map[t][i]=0;}}/*这里应该是走不下去了*/return ;}int main(){int n;/*n=5;map[1][2]=1;int a=check(2,1,n);printf("%d\n",a);*//*这个题目会超时所以先把所有的结果保存起来比较好while(scanf("%d",&n)!=EOF){if(n==0)break;num=0;memset(map,0,sizeof(map));dfs(0,n);printf("%d\n",num);}*/for(int i=1;i<=10;i++){num=0;memset(map,0,sizeof(map));dfs(0,i);ans[i]=num;}while(scanf("%d",&n)!=EOF){if(n==0)break;printf("%d\n",ans[n]);}return 0;}

0 0
原创粉丝点击