Problem E: 皇后问题(栈和队列)
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 11 Solved: 6
[ Submit][ Status][ Web Board]
Description
编写一个函数,求解皇后问题:在n*n的方格棋盘上,放置n个皇后,要求每个皇后不同行、不同列、不同左右对角线。
要求:
1、皇后的个数由用户输入,其值不能超过20,输出所有的解。
2、采用类似于栈求解迷宫问题的方法。
Input
输入一个整数n,代表棋盘的大小n*n,
Output
将计算出的彼此不受攻击的n个皇后的所有放置方案输出,每种方案占一行。
Sample Input
4
Sample Output
2 4 1 3
3 1 4 2
#include<stdio.h>
#include<math.h>
int
main()
{
int
place(
int
x[],
int
k);
void
Nqueens(
int
n,
int
x[]);
int
n,x[30],i;
scanf
(
"%d"
,&n);
Nqueens(n,x);
}
int
place(
int
x[],
int
k)
{
int
i;
for
( i=1;i<k;i++)
if
(x[i]==x[k]||(
fabs
(x[i]-x[k])==
fabs
(i-k)))
return
0;
return
1;
}
void
Nqueens(
int
n,
int
x[])
{
int
k=1,i;
x[1]=0;
while
(k>0)
{
x[k]=x[k]+1;
while
((x[k]<=n)&&(!place(x,k)))
{
x[k]=x[k]+1;
}
if
(x[k]<=n)
{
if
(k==n)
{
for
( i=1;i<=n;i++)
{
if
(i!=n)
printf
(
"%d "
,x[i]);
else
printf
(
"%d"
,x[i]);
}
printf
(
"\n"
);
}
else
{
k=k+1;x[k]=0;
}
}
else
{
k=k-1;
}
}
}