您的位置:首页 > 其它

HDU 2553 N皇后问题

2016-07-05 21:47 295 查看


N皇后问题


Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)


Total Submission(s) : 27   Accepted Submission(s) : 15


Font: Times New Roman | Verdana | Georgia


Font Size: ← →


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

     数据N<=10,所以可以先用数组存结果,根据题目可知,每行都应有一个皇后,可以每次从第一行开始然后逐行搜索。。。。
#include<iostream>
#include<stdio.h>
#include<cmath>
#include<string.h>
#include<string>
#include<queue>
#include<stack>
#include<vector>
#include<climits>
#include<stdlib.h>
using namespace std;

const int maxn=11;
int i,j,n,m,k;
int flag[maxn];
int sum;
int ans[maxn];

bool Judge(int k)
{
for(int i=1;i<k;i++)
if( flag[k]==flag[i] || abs(flag[k]-flag[i])==k-i )
return false;
return true;
}

void dfs(int k)
{
for(int i=1;i<=n;i++)
{
flag[k]=i;
if(Judge(k))
{
if(k==n)sum++;
else dfs(k+1);
}
}
}

int main()
{
for(int i=1;i<11;i++)
{
sum=0;
n=i;
dfs(1);
ans[i]=sum;
}
while(cin>>n,n)
{
cout<<ans
<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: