萌新也一看就懂题解—一本通1252:走迷宫题解

 题目链接

【题目描述】

一个迷宫由R行C列格子组成,有的格子里有障碍物,不能走;有的格子是空地,可以走。

给定一个迷宫,求从左上角走到右下角最少需要走多少步(数据保证一定能走到)。只能在水平方向或垂直方向走,不能斜着走。

【输入】

第一行是两个整数,R和C,代表迷宫的长和宽。( 1<= R,C <= 40)

接下来是R行,每行C个字符,代表整个迷宫。

空地格子用‘.’表示,有障碍物的格子用‘#’表示。

迷宫左上角和右下角都是‘.’。

【输出】

输出从左上角走到右下角至少要经过多少步(即至少要经过多少个空地格子)。计算步数要包括起点和终点。

在这里我们可以用 广搜+队列 的思想解决,对萌新很友好(解释在代码里),是刚学广搜的萌新福音

#include <bits/stdc++.h>
using namespace std;
//定义方向数组(顺时针探索) 
int fx[5] = {0,0,1,0,-1};
int fy[5] = {0,1,0,-1,0}; 
int tx,ty,m,n,i,j;
int s1,s2,e1,e2;
//定义头指针和尾指针 
int head = 1,tail = 1;
//定义队列 
int q[10000][4];
//定义地图 
char a[1000][1000];
int main(){
	cin>>n>>m;
	for(i = 1;i <= n;i ++){
		for(j = 1;j <= m;j ++){
			cin>>a[i][j];//读入地图 
		}
	}
	//因为是从[1,1]点开始,所以队列的第一项赋值尾为[1,1] 
	q[1][1] = 1;
	q[1][2] = 1;
	q[1][3] = 1;//第三项是计数 
	while(head <= tail){//循环直到头指针大于尾指针 
		//循环 4 次是因为要探索4个方向(上下左右) 
		for(i = 1;i <= 4;i ++){
			//欲要探索的坐标 
			tx = q[head][1] + fx[i]; 
			ty = q[head][2] + fy[i];
			//如果探索的点可以走 
			if(a[tx][ty] == '.'){
				a[tx][ty] = '#';//走过的点要标记,不然会死循环 
				tail ++;//尾指针加1 
				//把新的点的坐标加入队列 
				q[tail][1] = tx;//x坐标 
				q[tail][2] = ty;//y坐标 
				q[tail][3] = q[head][3] + 1;//每走过一步,就加一 (计数)
				if(tx == n && ty == m){//判断是否到达目标点,如果到达,输出计数点,结束程序 
					cout<<q[tail][3];//输出 
					return 0;//结束程序 
				}
			}
		}
		head++;//头指针加一,到一个新的点进行广搜 
	}
	return 0;
} 

给个赞哦~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值