记录一下解决八皇后问题的代码
1.枚举类型
#include<string>
#include<iostream>
using namespace std;
static int mapsize;
static int Queensize;
#define max 50
static int x[max + 1];
static int sum = 0;
typedef enum{unknown,wrong,wall,Right}status;
2.声明皇后类
struct Queen {//皇后类(重载运算符可忽略,是尝试用栈解决的部分)
int x, y;
status status;
//Queen(int xx = 0, int yy = 0) :x(xx), y(yy) {};//构造函数,对坐标(x,y)初始化
bool operator==(Queen const& q) {//重载运算符==
return(x == q.x) || (y == q.y) || (x + y == q.x + q.y) || (x - y == q.x - q.y);
}
bool operator!=(Queen & q1) { return!(*this == q1); }//重载运算符!=
};
#define max_size 20
static Queen map[max_size][max_size];//格子
3.对皇后图初始化
void transition(int q) {//对所有皇后图的格位初始化
void initialize(int i, int j);
for (int i = 0; i <= q; i++)
for (int j = 0; j <= q; j++) {
if (i == 0 || j == 0 || i == q - 1 || j == q - 1)
map[i][j].status = wall;
else map[i][j].status = unknown;
}
}
4.依次检查两个皇后相互是否安全
bool Place(int row,int col) {//依次检查两个皇后是否相互安全
for (int i = 1; i < row; i++) {
if (col == x[i] || abs(row - i) == abs(col - x[i]))
return false;
}
return true;
}
5.递归实现回溯
void backtrack(int t, int n) {//递归实现回溯
void display(int n);
if (t == n + 1){
sum++;
for (int a = 0; a < t-1; a++) {
map[a+1][x[a+1]].status = Right;
}
display(mapsize);
for (int a = 0; a < t-1; a++) {
map[a+1][x[a+1]].status = unknown;
}
}
else {
for (int i = 1; i <= n; i++) {
x[t] = i;
if (Place(t, x[t]))
backtrack(t + 1, n);
}
}
}
6.结果展示
void display(int n) {
if (sum != 0) {
cout << "第" << sum << "种方法:" << endl;
}
for(int i=0;i<n;i++){
for (int j = 0; j < n; j++)
{
switch (map[i][j].status) {
case unknown:cout << " "; break;
case wrong:cout << "×"; break;
case wall:cout << "■"; break;
case Right:cout << "○"; break;
default:break;
}
}
cout << endl;
}
cout << "共计" << sum << "种方法!" << endl;
}
7.输出结果(placequeen是我用于栈的算法)
void placeQueens(int n) {//n皇后算法(递归法)
//stack<Queen>solu;
//static int ii=1, jj=1;
//map[ii][jj].x = map[ii][jj].y = 1;
backtrack(1, n - 1);
}
int main() {
//placeQueens(4);
cout << "*********解决n皇后的问题:***********" << endl;
cout << "输入n的值:";
cin>> Queensize;;
mapsize= Queensize+2;
cout << "输出原始皇后图:" << endl;
transition(mapsize);//模块成功
//initialize(6,6);
display(mapsize);
cout << "输出问题解决图:" << endl;
placeQueens(mapsize-1);
return 0;
}
8.完毕