AcWing 1101 献给阿尔吉侬的花束(bfs宽搜)

[题目概述]

阿尔吉侬是一只聪明又慵懒的小白鼠,它最擅长的就是走各种各样的迷宫。
今天它要挑战一个非常大的迷宫,研究员们为了鼓励阿尔吉侬尽快到达终点,就在终点放了一块阿尔吉侬最喜欢的奶酪。
现在研究员们想知道,如果阿尔吉侬足够聪明,它最少需要多少时间就能吃到奶酪。
迷宫用一个 R × C R×C R×C 的字符矩阵来表示。
字符 S 表示阿尔吉侬所在的位置,字符 E 表示奶酪所在的位置,字符 # 表示墙壁,字符 . 表示可以通行。
阿尔吉侬在 1 个单位时间内可以从当前的位置走到它上下左右四个方向上的任意一个位置,但不能走出地图边界。

输入格式

第一行是一个正整数 T,表示一共有 T 组数据。
每一组数据的第一行包含了两个用空格分开的正整数 R 和 C,表示地图是一个 R×C 的矩阵。
接下来的 R 行描述了地图的具体内容,每一行包含了 C 个字符。字符含义如题目描述中所述。保证有且仅有一个 S 和 E。

输出格式

对于每一组数据,输出阿尔吉侬吃到奶酪的最少单位时间。
若阿尔吉侬无法吃到奶酪,则输出“oop!”(只输出引号里面的内容,不输出引号)。
每组数据的输出结果占一行。

数据范围

1 < T ≤ 10 , 1 < T ≤ 10, 1<T10,
2 ≤ R , C ≤ 200 2 ≤ R, C ≤ 200 2R,C200

输入样例:

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

输出样例:

5
1
oop!

题目就是让我们从起点到终点找到一条最短路径,没有的话就输出opp!。一提到最短路径就是bfs(宽度优先搜索)而不是dfs了,bfs是一层一层找,就可以找到最短路径。

  • bfs思想
    AcWing 1101 献给阿尔吉侬的花束(bfs宽搜)_第1张图片
    AcWing 1101 献给阿尔吉侬的花束(bfs宽搜)_第2张图片
    拿第一个样例模拟一下,画出来搜索树
    AcWing 1101 献给阿尔吉侬的花束(bfs宽搜)_第3张图片
    这个答案就是5

  • 完整代码

#include 
#include 
#include 
#include 
#include 
#include 

#define x first
#define y second
using namespace std;

typedef pair<int, int> PII;
const int N = 200;
char g[N][N]; // 存迷宫的字符
int dist[N][N]; // 起点到(i,j)的距离
int n, m, t;

int bfs(PII start, PII end) {
	queue<PII> q;

	dist[start.x][start.y] = 0;
	int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};

	q.push(start);

	while (q.size()) {
		PII f = q.front(); // 取出对头元素
		q.pop(); // 将对头元素出队

		for (int i = 0; i < 4; i ++) {
			int qx = f.x + dx[i], qy = f.y + dy[i];
			// 边界
			if (qx < 0 || qx >= n || qy < 0 || qy >= m)
				continue;
			// 墙壁
			if (g[qx][qy] == '#')
				continue;
			// 是否重复入队
			if (dist[qx][qy] != -1)
				continue;

			dist[qx][qy] = dist[f.x][f.y] + 1;

			if (end == make_pair(qx, qy)) {
				return dist[qx][qy];
			}

			q.push({qx, qy});
		}
	}
	return -1;
}

int main() {
	cin >> t;
	while (t --) {
		cin >> n >> m;
		for (int i = 0; i < n; i ++)
			cin >> g[i];

		PII start, end;
		for (int i = 0; i < n; i ++) {
			for (int j = 0; j < m; j ++) {
				if (g[i][j] == 'S')
					start = {i, j};
				else if (g[i][j] == 'E')
					end = {i, j};
			}
		}


		memset(dist, -1, sizeof dist);
		int distance = bfs(start, end);
		if (distance == -1) {
			cout << "oop!" << endl;
		} else
			cout << distance << endl;
	}
	return 0;
}
  • 本题的分享就结束了,此题相当于bfs的一个模板题,这个思想通了,遇到同类的就比较好想了
    别忘了点赞关注加收藏!

你可能感兴趣的:(宽度优先,算法)