HJ160 迷宫

  • 题目
  • 题解(8)
  • 讨论(9)
  • 排行

中等 通过率:19.57% 时间限制:2秒 空间限制:256M

知识点广度优先搜索(BFS)

校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。

描述

给定一个 n×mn×m 的迷宫,迷宫由 "#" 与"." 两种字符组成。其中 "#" 代表障碍物,"." 表示空地。迷宫中还有一个起点 "S" 和一个终点 "E" ,它们都可以视为空地。

由于近期迷宫发生了塌方,导致起点和终点之间可能并不连通。幸运的是,你拥有一种超能力------在迷宫中移动时(移动方向为上、下、左、右四个方向之一),可以在当前位置朝任一方向(上、下、左、右四个方向之一)释放激光。激光能够清除该方向上所有的障碍物,并且这种超能力至多只能使用一次。

现在,你需要判断是否能利用这种超能力成功从起点到达终点。

输入描述:

第一行给定两个整数 n,m(2≦n,m≦1000)n,m(2≦n,m≦1000) ,分别表示迷宫的行数和列数。

下面 nn 行,每行 mm 个字符,描述迷宫的具体布局。字符只包含 "#"、"."、"S" 和 "E",并且起点与终点有且仅有一个。

输出描述:

能够到达终点输出 YESYES ;否则输出 NONO。

示例1

输入:

复制代码
4 5
.####
S####
.####
.E###

复制输出:

复制代码
YES

复制

示例2

输入:

复制代码
4 5
..###
S####
#####
##.E#

复制输出:

复制代码
YES

复制说明:

复制代码

显然可以从起点出发,到达(1,2)(1,2)处并向下方使用超能力,此时可以从起点到达终点。

示例3

输入:

复制代码
4 5
..###
S####
#####
###E#

复制输出:

复制代码
NO
cpp 复制代码
#include<bits/stdc++.h>
using namespace std;

int n, m;
vector<pair<int, int>> min_max_row(2,{0x3f3f3f3f,0}); //min,max
vector<pair<int, int>> min_max_column(2,{ 0x3f3f3f3f,0 }); //min,max
pair<int, int> start;
pair<int, int> the_end;
int dx[] = { 0,0,1,-1 };
int dy[] = { 1,-1,0,0 };

bool visited[1001][1001];

bool check(vector<vector<char>>& graph, int x, int y) {
	if (x < n && y < m && x >= 0 && y >= 0 &&!visited[x][y] && graph[x][y] == '.') {
		return true;
	}
	return false;
}

void dfs(vector<vector<char>> &graph , int x,int y,int index) {
	visited[x][y] = true;
	min_max_column[index].first = min(min_max_column[index].first, x);
	min_max_column[index].second = max(min_max_column[index].second, x);
	min_max_row[index].first = min(min_max_row[index].first, y);
	min_max_row[index].second = max(min_max_row[index].second, y);
	for (int k = 0; k < 4; k++) {
		if (check(graph, x + dx[k], y + dy[k])) {
			dfs(graph, x + dx[k], y + dy[k],index);
		}
	}
}

int main() {

	cin >> n >> m;
	vector<vector<char>> graph(n, vector<char>(m));
	for (int k = 0; k < n; k++) {
		for (int j = 0; j < m; j++) {
			cin >> graph[k][j];
			if (graph[k][j] == 'S') {
				start = { k,j };
				graph[k][j] = '.';
			}
			if (graph[k][j] == 'E') {
				the_end = { k,j };
				graph[k][j] = '.';
			}
		}
	}
	dfs(graph, start.first, start.second, 0);
	memset(visited, false, sizeof(visited));
	dfs(graph, the_end.first, the_end.second, 1);
	if (min_max_row[0].first <= min_max_row[1].second + 1 && min_max_row[0].second >= min_max_row[1].first - 1) {
		cout << "YES";
		return 0;
	}
	if (min_max_column[0].first <= min_max_column[1].second + 1 && min_max_column[0].second >= min_max_column[1].first - 1) {
		cout << "YES";
		return 0;
	}
	cout << "NO";
	return 0;

}
相关推荐
Selvaggia21 分钟前
Diffusion Model 的基本原理与模型架构
算法
汉克老师1 小时前
CSP-J 2026 初赛试题解析(第一部分:选择题(8-15))精讲
c++·csp-j·小学生·学c++编程
wabs6662 小时前
关于二叉树【力扣572.另一棵树的子树的思考】
数据结构·c++·算法·leetcode·二叉树
hanlin032 小时前
刷题笔记:力扣第41题-缺失的第一个正数
笔记·算法·leetcode
shehuiyuelaiyuehao2 小时前
算法50,分治归并,数组中的逆序对
java·算法
风合星语3 小时前
2026 ROS 2 Lyrical C++ 入门(五):Action 实战——任务反馈、取消与超时处理
c++·机器人·ros2·异步编程·lyrical
阳明山水3 小时前
校准分位数驱动智能库存决策
人工智能·深度学习·算法·机器学习·架构
91刘仁德3 小时前
C++ 继承和多态 设计模式
c语言·c++·笔记
库玛西4 小时前
哈夫曼树与前缀编码:数据压缩的贪心核心
c语言·c++·笔记·考研
别动我齐刘海4 小时前
ROS2 Jazzy + C++ 实战路线——进阶学习3
c++·人工智能·vscode·python·算法·机器学习·机器人