利用隐式图的广度优先搜索算法解决迷宫问题

今天下午被一个迷宫问题搞懵了,想了许久才解决

首先有必要说明
隐式图:我们都知道一般的图具有明确的顶点和边,可以用邻接矩阵或者邻接表表示出来。但是实际应用中抽象出来的图往往根本没有顶点和边,这样的图就叫隐式图

迷宫问题:
在这里插入图片描述
用(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应该记录的值……

以上就是本小白的记录,如有偏颇,欢迎指正。

发布了19 篇原创文章 · 获赞 5 · 访问量 4207

猜你喜欢

转载自blog.csdn.net/qq_41409120/article/details/84840061
今日推荐