BFS——广度优先搜索

原题链接:登录—专业IT笔试面试备考平台_牛客网

走出迷宫​​​​​​​

题号:NC14572
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述 

小明现在在玩一个游戏,游戏来到了教学关卡,迷宫是一个N*M的矩阵。

小明的起点在地图中用“S”来表示,终点用“E”来表示,障碍物用“#”来表示,空地用“.”来表示。

障碍物不能通过。小明如果现在在点(x,y)处,那么下一步只能走到相邻的四个格子中的某一个:(x+1,y),(x-1,y),(x,y+1),(x,y-1);

小明想要知道,现在他能否从起点走到终点。

输入描述:

本题包含多组数据。
每组数据先输入两个数字N,M
接下来N行,每行M个字符,表示地图的状态。
数据范围:
2<=N,M<=500
保证有一个起点S,同时保证有一个终点E.

输出描述:

每组数据输出一行,如果小明能够从起点走到终点,那么输出Yes,否则输出No

输入

3 3
S..
..E
...
3 3
S##
###
##E

输出

Yes



解题思路:

遍历所有可能的点,从起点1出发,走它的所有的能走的邻居2,再逐一扩散,如果遇到终点,则标记一下,输出yes,反之输出no

#include<bits/stdc++.h>

using namespace std;

char room[504][504];
int dir[4][2] = {
	{-1,0},   //向左
	{0,-1},   //向上
	{1,0},    //向右
	{0,1}   //向下
};

int n, m, f;
#define check(x, y) (x < n && y < m && x >= 0 && y >= 0) 检查是否越界
struct node   //坐标
{
	int x;
	int y;
};

void BFS(int dx, int dy) {
	f=0;  // 标记
	queue<node>q;  //队列放坐标
	node start, next;
	start.x = dx;
	start.y = dy;
	q.push(start);
	while (!q.empty()) {
		start = q.front();
		q.pop();
		//cout<<start.x<<start.y<<endl;
		for (int i = 0; i < 4; i++)
		{
			next.x = start.x + dir[i][0];   //上下左右逐一搜索
			next.y = start.y + dir[i][1];
			if (check(next.x, next.y) && room[next.x][next.y] != '#' )  {
				//cout<<room[next.x][next.y]<<endl;  
				if(room[next.x][next.y]=='E'){  
					f=1;  //已找到终点,标记一下
				}
				room[next.x][next.y] = '#';   //标记已走过
				q.push(next);
			}
		}
	}
	
}

int main() {
	int x, y, dx, dy;
	while (cin >> n >> m) {
		if (n == 0 && m == 0) {
			break;
		}
		for (x = 0; x < n; x++) {
			for ( y = 0; y < m; y++){
				cin >> room[x][y];
				if (room[x][y] == 'S') {
					dx = x;
					dy = y;
				}
			}
		}
		f=0;
		BFS(dx, dy);
		if(f){
			cout<<"Yes"<<endl;
		}
		else{
			cout<<"No"<<endl;
		}
	}
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值