今天下午被一个迷宫问题搞懵了,想了许久才解决
首先有必要说明
隐式图:我们都知道一般的图具有明确的顶点和边,可以用邻接矩阵或者邻接表表示出来。但是实际应用中抽象出来的图往往根本没有顶点和边,这样的图就叫隐式图
迷宫问题:
用(1,1)代表迷宫入口,(4,4)代表迷宫出口,0代表有路可走,1代表墙壁,无法穿过,求入口到出口的一条路径。
问题分析:可以将迷宫抽象成一个图,把找路径的过程看成图的广度优先搜索。
话不多说,请看代码:
/*
隐式图的应用:迷宫问题
*/
#include<iostream>
#define N 10
using namespace std;
int maze[N][N] = {{0}, {0, 0, 0, 0, 0}, {0, 0, 1, 1, 0},
{0, 0, 0, 1, 1}, {0, 1, 0, 0, 0}};// 0表示有路可以通过,1表示墙,-1表示已经走过
int goUpAndDown[4] = {1, -1, 0, 0};// 控制向上走或向下走,1代表向上走,-1代表向下走
int goLeftAndRight[4] = {0, 0, 1, -1};// 控制向左走或向右走 ,1代表向左走,-1代表向右走
int queueX[N];// 记录x值的队列
int queueY[N];// 记录x值的队列
int pre[N];
void outFromMaze(int x, int y);
bool checkDirection(int x, int y);
void outputPath(int index);
int main() {
for (int i = 1; i <= 4; i++) {
for (int j = 1; j <= 4; j++)
cout << maze[i][j] << " ";
cout << endl << endl;
}
outFromMaze(1, 1);
return 0;
}
void outFromMaze(int x, int y) {
int front = 0, rear = 0;
int preIndex = 0;// 记录走向的结构体的下标
// 各自入队
queueX[rear] = x;
queueY[rear] = y;
pre[rear++] = -1;
// cout << "(" << x << ", " << y << ") ";
maze[x][y] = -1;// 访问过的点设为-1
while (front != rear) {
int dataX = queueX[front];
int dataY = queueY[front];
preIndex = front;
front++;
for (int dir = 0; dir < 4; dir++) {// 向上下左右四个方向探索
int goX = dataX + goUpAndDown[dir];
int goY = dataY + goLeftAndRight[dir];
if (checkDirection(goX, goY)) {
// cout << "(" << goX << ", " << goY << ") ";
maze[goX][goY] = -1;
// cout << dataX << "===pre===" << dataY << endl;
if (goX == 4 && goY == 4) {
queueX[rear] = goX;
queueY[rear] = goY;
pre[rear] = preIndex;
outputPath(rear);
return ;
}
// 各自入队
queueX[rear] = goX;
queueY[rear] = goY;
pre[rear++] = preIndex;
}
}
preIndex++;
}
}
bool checkDirection(int x, int y) {
if (x < 1 || x > 4 || y < 1 || y > 4 || maze[x][y] != 0)
return false;
else
return true;
}
void outputPath(int index) {
if (index == -1)
return ;
outputPath(pre[index]);
cout << "(" << queueX[index] << ", " << queueY[index] << ") ";
}
运行结果如下:
我遇到的瓶颈:记录路径的pre数组,我一直不知道该给它赋值。后来追根溯源,想到刚出队时的下标其实就是pre应该记录的值……
以上就是本小白的记录,如有偏颇,欢迎指正。