n皇后问题
作者:
无敌未央様 | 来源:发表于
2019-10-01 22:42 被阅读0次#include <bits/stdc++.h>
using namespace std;
int Count = 0;
int P[11]; //当前排列
int hashTable[11] = {false}; //记录哪几个数已经在P数组中了,保证没有重复行
int n;
void generateP(int index) {
if(index == n + 1) { //递归边界,生成一个合法方案
Count++; //方案数+1
for(int i=1;i<=n;i++){ //输出这个方案
printf("%d",P[i]);
}
printf("\n");
return;
}
for(int x = 1; x <= n; x++) { //第x行
if(hashTable[x] == false) { //这个数不在P[1]~P[index-1]中,即这一行没有皇后
bool flag = true; //true表示当前皇后不与之前皇后在对角线上
//第index列皇后在第x行,第pre列皇后在第P[pre]行
for(int pre = 1; pre < index; pre++) {
if(abs(index - pre) == abs(x - P[pre])) { //行数差=列数差,就是在对角线上
flag = false;
break;
}
}
if(flag) { //在与之前皇后的检查中没有发现在对角线上的
P[index] = x; //令第index列皇后正式登记为x行
hashTable[x] = true; //表示x行已被占用
generateP(index + 1); //递归处理下一列的皇后
hashTable[x] = false; //处理完毕,取消占用
}
}
}
}
int main() {
n=4; //n<=10
generateP(1);
cout<<Count;
return 0;
}
本文标题:n皇后问题
本文链接:https://www.haomeiwen.com/subject/suklpctx.html
网友评论