题目描述
会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。
输入
一个整数n( 1 < = n < = 10 )
输出
每行输出对应一种方案,按字典序输出所有方案。每种方案顺序输出皇后所在的列号,相邻两数之间用空格隔开。如果一组可行方案都没有,输出“no solute!”
样例输入
4
样例输出
2 4 1 3 3 1 4 2
列举每个点
index为x轴坐标, p[index]为y轴坐标. 即坐标点为(index, p[index])
显然每个点不在同一行同一列,枚举index+1时只需当前的坐标与前面已经填入的坐标是否构成对角线。
(如果要想知道递归时如果进行的,最好的办法就是使用debug进行调试,可以跟着程序运行一次)
#include<stdio.h>
#include<algorithm>
#include<vector>
#include<math.h>
using namespace std;
int n, flag = 0;
int vis[20];
int p[20];
void dfs(int index)
{
if(index==n)
{
flag = 1;
for(int i=0; i<n; i++)
{
printf("%d",p[i]);
if(i==n-1)
printf("\n");
else
printf(" ");
}
return;
}
for(int x=1; x<=n; x++)
{
if(vis[x]==0)
{
int flag = 1;
for(int pre = 0; pre<index; pre++)
{
if(abs(index-pre) == abs(x-p[pre]))
{
flag = 0;
break;
}
}
if(flag==1)
{
p[index] = x;
vis[x] = 1;
dfs(index+1);
vis[x] = 0;
}
}
}
return;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
for(int i=1; i<=n; i++)
vis[i] = 0;
dfs(0);
if(flag==0)
printf("no solute!\n");
}
return 0;
}