2553--Hdu--N皇后问题

N皇后问题

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5563    Accepted Submission(s): 2518


Problem Description
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。

 

Input
共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
 

Output
共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
 

Sample Input
   
   
   
   
1 8 5 0
 

Sample Output
   
   
   
   
1 92 10
#include<iostream> using namespace std; #include"stdio.h" #define MAX 12 int vst[MAX];                int cnt[MAX]; int ans; int n; bool flag; //vst[i] 表示第i个皇后的列数 //ans 存放的是当前方案的个数,用于复制给ans[i],n表示皇后循环个数的变量 //flag用来表示该位置能不能放皇后,能的话就为true void DFS(int row)     //深搜             {     int i,j;     if(row==n+1)     //如果所放皇后个数大于要求个数n,则该方案可行,ans+1       ans++;             else         for(i=1;i<=n;i++) //该皇后之前的也需要进行循环,先选定一个位置看下面能放几个,如果不够,这个也要换         {             flag=true;              vst[row]=i;               for(j=1;j<row;j++) //将该皇后之前的各个皇后都与之进行比较,看是否满足条件             {                 if(vst[row]==vst[j]||vst[row]-row==vst[j]-j||vst[row]+row==vst[j]+j)      //                  { //如果在同一斜线或同一列就不能放                     flag=false;                     break;                      }             }             if(flag)                 DFS(row+1); // 如果能放,考虑放置下一个皇后,row+1         }          } int main() {     int i;     for(n=1;n<11;n++)//´从1~10先算出各个方案,下面直接输出     {         ans=0;         DFS(1); //每次都是从1开始搜索         cnt[n]=ans;// cnt[i]表示放i个皇后的可行方案个数     }      while(scanf("%d",&n)!=EOF&&n)     {         printf("%d\n",cnt[n]);     }     return 0; }

你可能感兴趣的:(2553--Hdu--N皇后问题)