题目描述:
会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。
输入:
一个整数n( 1 < = n < = 10 )
输出:
每行输出对应一种方案,按字典序输出所有方案。每种方案顺序输出皇后所在的列号,相邻两数之间用空格隔开。如果一组可行方案都没有,输出“no solute!”
样例输入:
4
样例输出:
2 4 1 3
3 1 4 2
实现代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <math.h>
using namespace std;
int n;
int P[15]={0};
bool hashTable[15]={false};
int num=0;
void DFS(int index){
if(index==n+1){
num++;
int flag=0;
for(int i=1;i<=n;i++){
if(!flag){
printf("%d",P[i]);
flag=1;
}else{
printf(" %d",P[i]);
}
}
printf("\n");
}
for(int x=1;x<=n;x++){
if(hashTable[x]==false){
bool flag=true;
for(int pre=1;pre<index;pre++){
if(abs(index-pre)==abs(x-P[pre])){
flag=false;
break;
}
}
if(flag){
P[index]=x;
hashTable[x]=true;
DFS(index+1);
hashTable[x]=false;
}
}
}
}
int main()
{
while(scanf("%d",&n)!=EOF){
num=0;
memset(P,0,sizeof(P));
fill(hashTable,hashTable+15,false);
DFS(1);
if(num==0){
printf("no solute!\n");
}
}
return 0;
}