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

2024-02-09 05:12

本文主要是介绍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思想
    请添加图片描述
    请添加图片描述
    拿第一个样例模拟一下,画出来搜索树
    请添加图片描述
    这个答案就是5

  • 完整代码

#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <cstdio>
#include <queue>#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;} elsecout << distance << endl;}return 0;
}
  • 本题的分享就结束了,此题相当于bfs的一个模板题,这个思想通了,遇到同类的就比较好想了
    别忘了点赞关注加收藏!

这篇关于AcWing 1101 献给阿尔吉侬的花束(bfs宽搜)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/693215

相关文章

hdu1254(嵌套bfs,两次bfs)

/*第一次做这种题感觉很有压力,思路还是有点混乱,总是wa,改了好多次才ac的思路:把箱子的移动当做第一层bfs,队列节点要用到当前箱子坐标(x,y),走的次数step,当前人的weizhi(man_x,man_y),要判断人能否将箱子推到某点时要嵌套第二层bfs(人的移动);代码如下:

poj 2195 bfs+有流量限制的最小费用流

题意: 给一张n * m(100 * 100)的图,图中” . " 代表空地, “ M ” 代表人, “ H ” 代表家。 现在,要你安排每个人从他所在的地方移动到家里,每移动一格的消耗是1,求最小的消耗。 人可以移动到家的那一格但是不进去。 解析: 先用bfs搞出每个M与每个H的距离。 然后就是网络流的建图过程了,先抽象出源点s和汇点t。 令源点与每个人相连,容量为1,费用为

POJ 3057 最大二分匹配+bfs + 二分

SampleInput35 5XXDXXX...XD...XX...DXXXXX5 12XXXXXXXXXXXXX..........DX.XXXXXXXXXXX..........XXXXXXXXXXXXX5 5XDXXXX.X.DXX.XXD.X.XXXXDXSampleOutput321impossible

深度优先(DFS)和广度优先(BFS)——算法

深度优先 深度优先搜索算法(英语:Depth-First-Search,DFS)是一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支,当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访

【AcWing】851. 求最短路

spfa算法其实是对贝尔曼福特算法做一个优化。 贝尔曼福特算法会遍历所有边来更新,但是每一次迭代的话我不一定每条边都会更新,SPFA是对这个做优化。 如果说dist[b]在当前这次迭代想变小的话,那么一定是dist[a]变小了,只有a变小了,a的后继(b)才会变小。 用宽搜来做优化,用一个队列,队列里边存的就是所有变小了的结点(队列里存的是待更新的点)。 基本思路就是我更新过谁,我再拿

双头BFS

牛客月赛100 D题,过了80%数据,调了一下午。。。烦死了。。。 还是没调试出来,别人的代码用5维的距离的更新有滞后性,要在遍历之前要去重。。。 #include<bits/stdc++.h>using namespace std;const int N=2e3+10;char g[N][N];int dis[N][N],d1[N][N];int n,m,sx,sy;int dx

Knight Moves -uva 简单的BFS遍历

昨天刚学了BFS的遍历,在uva上找了个题敲了出来,感觉还不错,最近敲代码挺有手感的,希望这种状态保持下去 #include<iostream>#include<stdio.h>#include<stdlib.h>#include<string.h>#define MAX_SIZE 10 + 5#define LEN 100 + 10using namespace std;in

【CF】D. Arthur and Walls(BFS + 贪心)

D题 解题思路就是每次检查2X2的方格里是否只有一个‘*’,如果有的话这个*就需要变成‘.’,利用BFS进行遍历,入队的要求是这个点为. 一开始将所有的'.'全部加入队列,如果碰到一个'*'变成'.'就入队,判断的时候从4个方向就行判断 题目链接:http://codeforces.com/contest/525/problem/D #include<cstdio>#include<

【AcWing】852. spfa判断负环

#include<iostream>#include<algorithm>#include<cstring>#include<queue>using namespace std;const int N= 1e5+10;int n,m;int h[N],w[N],e[N],ne[N],idx;int dist[N],cnt[N];//cnt存最短路径的边数bool st[N];v

hdu2717(裸bfs广搜)

Catch That Cow Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7304 Accepted Submission(s): 2308 题目链接: http://acm.hdu.edu.cn/showproblem.