N皇后问题

N皇后问题

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 723 Accepted Submission(s): 419
 
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
 
Author
cgf
 
Source
2008 HZNU Programming Contest
 
Recommend
lcy
 
#include<bits/stdc++.h>
#define maxn 15
using namespace std;
int low[15],res[15];
int lmid[15],rmid[15];//左斜线和右斜线都是从上往下数的
int n;
int cur;
void dfs(int x)
{
    if(x==n)
    {
        cur++;
        return ;
    }
    for(int i=x;i<n;i++)
    {
        if(low[i])continue;
        for(int j=0;j<n;j++)
        {
            if(res[j]||lmid[i+n-1-j]||rmid[i+n-(n-j)]) continue;
            low[i]=1;
            res[j]=1;
            lmid[i+n-1-j]=1;
            rmid[i+n-(n-j)]=1;
            dfs(x+1);
            low[i]=0;
            res[j]=0;
            lmid[i+n-1-j]=0;
            rmid[i+n-(n-j)]=0;
        }
    }

}
int main()
{
    for(n=1;n<=10;n++)
    {
        memset(low,0,sizeof low);
        memset(res,0,sizeof res);
        memset(lmid,0,sizeof lmid);
        memset(rmid,0,sizeof rmid);
        cur=0;
        dfs(0);
        cout<<"n="<<n<<" "<<cur<<endl;
    }
}
/* 附带打表大法,打表大法好啊!
#include <iostream>
#include<stdio.h>
using namespace std;
int n,x[11]={0,1,0,0,2,10,4,40,92,352,724};
int main()
{
    while(~scanf("%d",&n)&&n)
    printf("%d\n",x[n]);
    return 0;
}*/

 

posted @ 2016-11-17 18:50  勿忘初心0924  阅读(332)  评论(0编辑  收藏  举报