题目描述
在N*N的棋盘上放置N个皇后(n<=10)而彼此不受攻击(即在棋盘的任一行,任一列和任一对角线上不能放置2个皇后),编程求解所有的摆放方法。
输入
输入:n
输出
每行输出一种方案,每种方案顺序输出皇后所在的列号,每个数占5列。若无方案,则输出no solute!
样例输入
4
样例输出
2 4 1 3 3 1 4 2
#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std ;
int a[15] ,n,t=0; //a[i]表示第i行第a[i]列
//判断是否和前面的皇后冲突
bool place(int x){
bool ok=true ;
for(int i=1;i<x;i++)
if(a[x]==a[i] || x-i==fabs(a[x]-a[i]))
{ ok=false;break;}
return ok ;
}
void search(int x){
if(x==n+1) { //递归边界,只要走到这里所有皇后必然没有冲突
t=1;
for(int i=1;i<=n;i++) cout << setw(5) << a[i] ;
cout <<"\n" ;
}
else for(int i=1;i<=n;i++){
a[x]=i;
if(place(x)) search(x+1) ; //如果不冲突,则继续递归
}
}
int main()
{
cin >> n ;
search(1) ;
if(t==0) cout << "no solute!" ;
return 0;
}