Week2 作业 A - Maze

题目

东东有一张地图,想通过地图找到妹纸。地图显示,0表示可以走,1表示不可以走,左上角是入口,右下角是妹纸,这两个位置保证为0。既然已经知道了地图,那么东东找到妹纸就不难了,请你编一个程序,写出东东找到妹纸的最短路线。

解题思路

这道题目可以用广度优先搜索解决。以左上角(0,0)开始,查找地图上与当前点上下左右相邻可以走的且未到达过的点,把符合条件的点在 L[i][j] 标上与起始点的距离,然后加入到队列中。每次从队列中取出一个点,当这个点不为终点时,找出符合条件的点加入到队列中。要做到这些,我们需要建立 5x5 的二维数组 L 存储输入的地图,二维数组 t 记录某个点是否已经加入过队列中,数组 dx dy 存储上下左右四个移动方向在坐标轴 x,y 上的偏移值。

我们在地图上标出某个点与起始点的距离后,从终点开始往前寻找路径,将找到的点依次保存到栈中,完成路径的搜寻后,依次输出栈顶到栈尾的元素,这就是我们要获得的路径。

代码

#include <iostream>
#include<queue>
#include<stack>
using namespace std;
struct point { //点
	int x;
	int y;
	point(int xx, int yy) {
		x = xx; y = yy;
	}
};
queue<point> q;
stack<point> s;
int L[5][5] = { 0 };
int t[5][5] = { 0 };
int dx[] = { 1,0,-1,0 };
int dy[] = { 0,1,0,-1 };


int bfs() { //广度优先搜索标出某个点到起始点的距离
	q.push(point(0, 0)); //将起始点插入到队列中
	t[0][0] = 1; //标记到达
	while (!q.empty()) { //当队列不空
		point now = q.front(); q.pop(); //取出头元素
		if (now.x == 5 && now.y == 5) break; //到达终点,返回
		for (int i = 0; i < 4; i++) { //依次判断四个相邻位置
			int x = now.x + dx[i]; int y = now.y + dy[i];
			if (x >= 0 && x < 5 && y >= 0 && y < 5 && !t[x][y] && L[x][y] != -1) {
				L[x][y] = L[now.x][now.y] + 1; //位置合法且未到达,标记距离
				t[x][y] = 1; //标记到达
				q.push(point(x, y)); //入队列
			}
		}
	}
	return  0;
}
void outp() { //输出路径
	int max = L[4][4];
	int cur = max, cx = 4, cy = 4;
	s.push(point(4, 4)); //终点入栈
	while (cur >0) { //当距离大于0时,继续循环
		for (int i = 3; i >=0; i--) { //判断四个方位
			int x = cx + dx[i]; int y = cy + dy[i];
			if (L[x][y]==cur-1) { //是前一个点
				s.push(point(x, y)); //入栈
				cx = x; cy = y;  break;
			}
		}
		cur--;
	}
	while (!s.empty()) { //输出栈中的点
		point p = s.top();
		s.pop();
		cout << "(" << p.x << ", " << p.y << ")\n";

	}
}
int main() //主函数入口
{
	int a, b, n;
	for (int i = 0; i < 5; i++) { //输入地图
		for (int j = 0; j < 5; j++) {
			cin >> a;
			if (a == 1) L[i][j] = -1;
			else L[i][j] = 0;
		}
	}
	bfs();
	outp();
	return 0;
}
发布了16 篇原创文章 · 获赞 2 · 访问量 312

猜你喜欢

转载自blog.csdn.net/ziseon/article/details/104690293