本题链接:点击打开链接
N皇后问题
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 22817 Accepted Submission(s): 10157
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
Recommend
lcy | We have carefully selected several similar problems for you: 2614 1258 1045 1426 1035
解题思路:题意就不说了,大家都懂,这里我和大家再提一下经典的八皇后问题,很多参考书上都有,上面说了所有符合条件的放置方法,都恰好满足每行每列各放置一个皇后。这里我们用 a[x] 表示第 x 行皇后的位置(也就是其列编号)。但为了节省时间,我们还是选择打表的方法。
代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
int a[11]; //第i个皇后放在第i行的第a[i]位
int c[11]={0}; //存放10以内满足条件的次数
int m,n,s;
bool ok(int x)
{
for(int i=1; i<x; i++)
if(a[x]==a[i] || abs(a[x]-a[i])==x-i) //列和对角线不能重复
return 0;
return 1;
}
void dfs(int x)
{
if(x==m+1)
s++;
for(int i=1; i<=m; i++)
{
a[x]=i;
if(ok(x))
dfs(x+1);
}
}
int main()
{
for(int i=1; i<11; i++) //本题这样做必须打表,不然会超时。
{
m=i;
s=0;
dfs(1);
c[i]=s;
}
while(~scanf("%d",&n)&&n)
{
printf("%d\n",c[n]);
}
return 0;
}