hdu 2553 N皇后问题

来源:互联网 发布:js点击按钮退出全屏 编辑:程序博客网 时间:2024/06/05 14:08
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2553

dfs的题

 1 #include<iostream> 2 #include<stdio.h> 3 #include<math.h> 4 #include<stdlib.h> 5 #include<string.h> 6 using namespace std; 7 const int N=20; 8 int n; 9 int count;//多少种排列组合10 int a[N];//a[i]=j代表的是在i行j列11 int visit[N];//用来排除列,例:a[1]=1;上有皇后,那么visit[a[1]]=1;12 int check(int i,int j)//验证第i行j列13 {14     int k;15     int flag=1;16     for(k=1;k<i;k++)17     {18         if( abs(k-i) == abs(j-a[k]) )//检查是否在斜线相交19         flag=0;20     }21     return flag;22 }23 24 void dfs(int i)//i代表行数25 {26      if(i>n)27      count++;28      else29      {30          int j;31          for(j=1;j<=n;j++)32          {33              if(visit[j]==0 && check(i,j))//检查位置34              {35                  a[i]=j;36                  visit[j]=1;37                  dfs(i+1);38                  visit[j]=0;39              }40          }41      }42 }43 44 int main()45 {46     //freopen("in.txt","r",stdin);47     int b[15];48     memset(b,0,sizeof(b));49     int i;50     count=0;51     for(i=1;i<=10;i++)52     {53         n=i;54         memset(a,0,sizeof(a));55         memset(visit,0,sizeof(visit));56         dfs(1);//从第一行开始57         b[i]=count;58         //printf("%d ",b[i]);59         count=0;60     }61     int m;62     while(~scanf("%d",&m))//打表后输出,不然时超63     {64         if(m==0)65         break;66         printf("%d\n",b[m]);67     }68     return 0;69 }

 

原创粉丝点击