题目描述
在N*N(1<N<=9)的棋盘上放置N个皇后而彼此不受攻击(即在棋盘的任一行,任一列和任一对角线上不能放置2个皇后),编程求解所有的摆放方法。
输入
一个整数n(1<n<=9)
输出
若有解,输出若干行,每行n个数,中间有两个空格,依次表示第i个皇后的列号
若无解,输出 “no”
样例输入
4
样例输出
2 4 1 3
3 1 4 2
代码里面有注释,回溯法的应用
#include<iostream>
#include<cmath>
#include<stdio.h>
#include<algorithm>
using namespace std;
int x[105];//x[i]=y;表示第i个皇后(当然第i个皇后也在第i行)在第i行的第y列
int n,num;
int place(int t)//判断现在皇后的位置是否与前面的皇后位置有冲突
{
for(int i=1;i<t;i++)
{
if(x[i]==x[t]||t-i==abs(x[i]-x[t]))// x[i]==x[t]表示在同一列, t-i==abs(x[i]-x[t])表示在斜对角
{
return 0;
break;
}
}
return 1;
}
void BackTrace(int t)
{
if(t>n)
{
num++;
for(int i=1;i<n;i++)
cout<<x[i]<<" ";
cout<<x[n]<<endl;
}
else
{
for(int i=1;i<=n;i++)
{
x[t]=i;
if(place(t)==1)
BackTrace(t+1);
}
}
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
num=0;
BackTrace(1);
if(num==0)
cout<<"no"<<endl;
}
}