#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <queue>
#include <algorithm>
using namespace std;
int a[9]; //Key->行数 Value->列 => 一维的二维化
int j[9]={0}; //辅助 -状态变量 ->每列有无
int c[100] ={0};
int d[100] ={0};
int total=0;
void print();
void search(int h){ //h表示行
for(int i=1;i<=8;i++){ //每个棋子有8列可以放
if((!j[i]) && (!c[i+h]) && (!d[h-i+7])){ //1.条件
a[h] = i; //放棋子
j[i] = 1; //占领列
c[h+i] = 1;
d[h-i+7] = 1; //占领对角线
if(h==8){total++;} //2.目的
else{search(h+1);} //3.搜索
//if-else必须框柱 ->无论h是否==8,都必须回溯
j[i] = 0; //4.回溯恢复
c[h+i] = 0;
d[h-i+7] = 0;
}
}
}
void print(){
total++;
}
int main()
{
//流程图:分析 >> 敲码 -> !不要用战术上的勤奋掩盖战略上的懒惰!
search(1); //从第1行开始
cout << total;
return 0;
}
//cout << "输入";
例5.4 - 八皇后问题
最新推荐文章于 2023-06-06 23:45:48 发布