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