问题 B: N皇后问题(Queen.cpp)
时间限制: 1 Sec 内存限制: 128 MB
题目描述
在N*N的棋盘上放置N个皇后(n<=10)而彼此不受攻击(即在棋盘的任一行,任一列和任一对角线上不能放置2个皇后),编程求解所有的摆放方法。
输入
输入:n
输出
每行输出一种方案,每种方案顺序输出皇后所在的列号,每个数占5列。若无方案,则输出no solute!
样例输入
4
样例输出
2 4 1 3
3 1 4 2
#include <iostream>//八皇后可以说是最简单的回溯题目了
#include <algorithm>
const int maxn= 100 ;
using namespace std;
void dfs(int n);
int a[maxn];
int flag=1;//flag作为是否有结果的标志
int n;
int main()
{
scanf("%d",&n);
dfs(1);
if(flag)//如果有过输出则不进行no solute的输出
{
printf("no solute!\n");
}
return 0;
}
void dfs(int b)
{
if(b==n+1)//当n个皇后成功放置完就输出
{
for(int i=1;i<=b-1;i++)
{
printf("%5d",a[i]);
flag=0;
}
printf("\n");
}
for(int i=1;i<=n;i++)
{
a[b]=i;
int ok=1;
for(int j=1;j<b;j++)
{
if(a[b]==a[j]||b-a[b]==j-a[j]||b+a[b]==j+a[j])
/*在这里同时判断是否在同行同列同斜线*/
{
ok=0;
break;//如果出现这些情况就回溯
}
}
if(ok)//放置成功就进行下一个皇后的放置
dfs(b+1);
}
}