迷宫问题(Bfs)

迷宫问题 | JXNUOJ

定义一个二维数组:

int maze[5][5] = {

0, 1, 0, 0, 0,

0, 1, 0, 1, 0,

0, 0, 0, 0, 0,

0, 1, 1, 1, 0,

0, 0, 0, 1, 0,

};


它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。

输入:

一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。

输出:

左上角到右下角的最短路径,格式如样例所示。

样例输入:

0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0

样例输出:

(0, 0)
(1, 0)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(3, 4)
(4, 4)
#include<iostream>
#include<cstdio>
using namespace std;
struct maze {
	int x, y, f;//该空格横纵坐标和上一个空格的队列下标
}e,w;
int q[] = { -1,0,1,0 };
int p[] = { 0,1,0,-1 };//使遍历顺时针进行
int a[5][5], b[5][5];//b数组用来记录上一步,防止退回
struct maze que[50],ans[50];
int front, rear;//队列的基本信息

void print(struct maze w)//这里的输出学到了!!!先找后输出
{
	if (w.f != -1)//==-1时直接输出,就没有遗忘起点!!!
		print(que[w.f]);
	cout << "(" << w.x << "," << " " << w.y << ")" << endl;
}
void bfs()
{
	front = rear = 0;
	e.x = 0, e.y = 0, e.f = -1;
	b[0][0] = 1;//遗忘了这个!!!!导致一直无答案
	que[rear++] = e;//将起始位置存入队列
	while (front < rear)//当队列不为空时
	{
		e = que[front++];//得到队首坐标(起点与终点相等时要单独考虑)
		for (int i = 0; i < 4; i++) {//遍历四个方向
			w.x = e.x + q[i];
			w.y= e.y + p[i];
			w.f = front - 1;//上一个状态
			if(w.x == 4 && w.y == 4) {//到达终点,写到循环里面,保证单层就可以退出
				/*int i = 0;
				//cout << "123";
				while (w.f!=-1) {
					ans[i] = w;//这里开始打成了e,调试了好久
					w = que[w.f];
					i++;
				}
				cout <<"(0, 0)" << endl;//逗号后面有空格,周赛用深搜做的时候就在这里错了
				for (i--; i >= 0; i--)
					cout << "(" << ans[i].x << "," <<" " << ans[i].y << ")" << endl;*/
				if (w.f != -1)
					print(w);
				return;
			}
			if (w.x >= 0 && w.x < 5 && w.y >= 0 && w.y< 5 && !a[w.x][w.y] && !b[w.x][w.y]) {
		
				que[rear++] = w;//进队
				b[w.x][w.y] = 1;
			}
		}
	}
}
int main()
{
	for (int i = 0; i < 5; i++) {//输入迷宫
		for (int j = 0; j < 5; j++) {
			cin >> a[i][j];
		}
	}
	bfs();
	
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值