迷宫实现代码如下,请重点关注showMaze函数和generate函数
#include <iostream>
#include <vector>
#include <algorithm>
#include <ctime>
using namespace std;
class Maze {
public:
Maze(int row = 0, int col = 0);
void connect(int i, int j);
void disconnect(int i, int j);
vector<int> connected(int i) const; // 修改为接收一个参数
vector<int> surrounded(int i) const; // 修改为接收一个参数
int Row() const;
int Col() const;
bool isConnected(int i, int j) const;
private:
int row;
int col;
vector<vector<int> > neighbor;
vector<vector<int> > surround;
};
Maze::Maze(int row, int col) {
this->row = row;
this->col = col;
for (int i = 0; i < col * row; i++) {
vector<int> tmp(row * col, 0);
neighbor.push_back(tmp);
surround.push_back(tmp);
}
for (int i = 0; i < col * row; i++) {
if ((i - 1) % col != 0)
surround[i][i - 1] = 1; // 左邻居,排除第一列
if ((i + 1) % col != 0)
surround[i][i + 1] = 1; // 右邻居,排除最后一列
if (i - col >= 0)
surround[i][i - col] = 1; // 上邻居
if (i + col < row * col)
surround[i][i + col] = 1; // 下邻居
}
}
void Maze::connect(int i, int j) {
neighbor[i][j] = 1;
neighbor[j][i] = 1;
}
void Maze::disconnect(int i, int j) {
neighbor[i][j] = 0;
neighbor[j][i] = 0;
}
vector<int> Maze::connected(int i) const { // 修正为单参数函数
vector<int> result;
for (int t = 0; t < row * col; t++) {
if (neighbor[i][t] == 1) {
result.push_back(t);
}
}
return result;
}
vector<int> Maze::surrounded(int i) const { // 修正为单参数函数
vector<int> result;
for (int t = 0; t < row * col; t++) {
if (surround[i][t] == 1) {
result.push_back(t);
}
}
return result;
}
int Maze::Row() const {
return row;
}
int Maze::Col() const {
return col;
}
bool Maze::isConnected(int i, int j) const {
vector<int> con = this->connected(i);
auto it = find(con.begin(), con.end(), j);
if (it != con.end()) {
return true;
} else {
return false;
}
}
void showMaze(const Maze &m) {
//自左上角向右下角显示
int row = m.Row();
int col = m.Col();
for (int i = 0; i < col; i++) {
cout << "_ ";
}
cout << endl;
for (int r = 0; r < row; r++) {
cout << "|";
for (int c = 0; c < col; c++) {
if (m.isConnected(r * col + c, (r + 1)* col + c)) {
cout << " ";
} else {
cout << "_";
}
if (m.isConnected(r * col + c, r * col + c + 1)) {
cout << " ";
} else {
cout << "|";
}
}
cout << endl;
}
}
namespace DFS {
enum color {
white,
gray,
black
};
Maze generate(int row, int col) {
Maze result(row, col);
vector<color> record(row * col, white);
vector<int> current;
current.reserve(static_cast<size_t>(row * col));
record[0] = gray;
current.push_back(0);
while (current.size() != 0) {
int index = current.back();
vector<int> sur = result.surrounded(index);
random_shuffle(sur.begin(), sur.end(), [](vector<int>::difference_type n)->vector<int>::difference_type{
return rand() % n;
});
int i = 0;
for (; i < sur.size(); i++) {
if (record[sur[i]] == white) {
current.push_back(sur[i]);
result.connect(index, sur[i]);
record[sur[i]] = gray;
break;
}
}
if (i == sur.size()) {
current.pop_back();
record[index] = black;
}
}
return result;
}
}
主函数如下
int main() {
srand((unsigned int)time(NULL));
Maze maze2 = DFS::generate(10, 10);
showMaze(maze2);
return 0;
}
大多情况都是这种对的
少数时候会有这样的,右侧第一列少了一堵墙,左侧给封死了
请关注一下generate中random_shuffle的第三个参数——用于随机的lambda,我觉得问题可能出在这里,如果没看出来问题的话,也请各位看看能不能给出别的随机写法,说不定就没问题了,谢谢!