具体代码如下
// HomeWork_P72.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include "pch.h"
#include <iostream>
#include <vector>
#include <random>
#include <ctime>
using namespace std;
#define NUMOFQUEEN 8
//检查是否合法
bool isOk(int x, int y, vector<vector<int>> chessBox) {
//检查列
for (int i = 0; i < NUMOFQUEEN; ++i)
if (chessBox[i][y] == 1)
return false;
//检查135度和45度方向
for(int i=0;i< NUMOFQUEEN;++i)
for (int j = 0; j < NUMOFQUEEN; ++j) {
if (chessBox[i][j] == 1) {
if (i - j == x - y || i + j == x + y)
return false;
}
}
return true;
}
//回溯法求八皇后
void backTrack(vector<vector<int>> &chessBox) {
int i = 0, j = 0;
vector<int> stack;//保存列号
while (i < NUMOFQUEEN) {
bool findJ = false;
for (; j < NUMOFQUEEN; ++j)
if (isOk(i, j, chessBox)==true) {
findJ = true;
break;
}
if (findJ) {
chessBox[i][j] = 1;//放置皇后
stack.push_back(j);//将当前列入栈
++i;
j = 0;
}
else {
--i;
;
j = *(--stack.end());//回溯到上一行j
stack.pop_back();//列出栈
chessBox[i][j] = 0;
j++;//从当前列的下一列开始
}
}
}
//打印结果
void print(vector<vector<int>> chessBox) {
for (auto ii : chessBox) {
for (auto jj : ii) {
cout << jj;
}
cout << endl;
}
}
//LV贪心算法,求八皇后问题
void QueensLV()
{
}
int main() {
//生成棋盘,每位初始化为0,表示没有占用,1表示占用。
vector<vector<int>> chessBox(NUMOFQUEEN, vector<int>(NUMOFQUEEN));
//回溯法
backTrack(chessBox);
//打印
print(chessBox);
}