HDU 2553 N皇后问题

D - N皇后问题
Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u
Submit  Status  Practice  HDU 2553

Description

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

 

Input

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

Output

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

Sample Input

 
        
1 8 5 0
 

Sample Output

 
        
1 92 10
 

裸DFS,因为多组数据,且n较小,可以先预处理将结果打表后输出,否则超时。
注意:二维格点同一主对角线上所有元素横纵坐标之差相同,同一副对角线的横纵坐标之和相同。
此题还有高效位运算版,附上链接:http://blog.csdn.net/xadillax/article/details/6512318
记得对于8皇后,有组合数学解法,但记不太清了,欢迎留言补充。
拓展阅读:

八皇后问题算什么,来看看无穷皇后问题吧

http://www.matrix67.com/blog/archives/4556
#include 
#include 
using namespace std;
int a[40],b[40],c[40],d[20]={0},n,ans,p;
void dfs(int k){
  int i,j;
  if (k>p) ans++;
  else {
    for (i=1;i<=p;i++){
      if (!a[i] && !b[k+i] && !c[10+k-i]){
        a[i]++;b[k+i]++;c[10+k-i]++;
        dfs(k+1);
        a[i]--;b[k+i]--;c[10+k-i]--;
      }
    }
  }
}
int main()
{
    cin>>n;
    int j;
    for (p=1;p<=10;p++){
      ans=0;
      memset(a,0,sizeof(a));
      memset(b,0,sizeof(b));
      memset(c,0,sizeof(c));
      dfs(1);
      d[p]=ans;
    }
    while (n!=0){

      cout<>n;
    }
    return 0;
}

 
      

你可能感兴趣的:(ACM,搜索)