AcWing 1101.献给阿尔吉侬的花束

2024-04-07 10:12

本文主要是介绍AcWing 1101.献给阿尔吉侬的花束,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

思路:BFS

这里不用BFS进行遍历了,这里实验一种比较高效的BFS遍历:双向BFS。

其实这个双向BFS很简单,也就是说我们只要知道了终点和起点,这两个并不能少其中一个,这样我们就可以用双向BFS来节省时间。

下面是代码,大家可以参考一下,也就是多了一个遍历数组,用来识别我们是否已经双向遍历完这个地图了。

上代码;

#include<iostream>
#include<stdio.h>
#include<cstring>
#include<cstdlib>
#include<cmath> 
#include<vector>
#include<algorithm>
#include<stack>
#include<queue>
#include<deque>
#include <iomanip>
#include<sstream>
#include<numeric>
#include<map>
#include<limits.h>
#include<unordered_map>
#include<set>
#define int long long
#define MAX 505
#define inf 0x3f3f3f3f
#define _for(i,a,b) for(int i=a;i<(b);i++)
#define ALL(x) x.begin(),x.end()
using namespace std;
typedef pair<int, int> PII;
int n, m;
int counts;
int dx[] = { 0,1,0,-1};
int dy[] = { 1,0,-1,0 };
char maps[MAX][MAX];
int vis[MAX][MAX];
int dist[MAX][MAX];
queue<PII>q;
int stx, sty, edx, edy;
int bfs() {vis[stx][sty] = 1;vis[edx][edy] = 2;dist[stx][sty] = 0;dist[edx][edy] = 0;q.push({ stx,sty });q.push({ edx,edy });while (!q.empty()) {auto tmp = q.front();q.pop();_for(i, 0, 4) {int a = dx[i] + tmp.first;int b = dy[i] + tmp.second;if (vis[a][b] + vis[tmp.first][tmp.second] == 3)return  dist[a][b] + dist[tmp.first][tmp.second] + 1;if (maps[a][b] == '#')continue;if (a > n || a<1 || b>m || b < 1)continue;if (dist[a][b] >= 0)continue;if (vis[a][b] == -1)vis[a][b] = vis[tmp.first][tmp.second];dist[a][b] = dist[tmp.first][tmp.second]+1;q.push({ a,b });}}return -1;
}
signed main() {ios::sync_with_stdio(false);cin.tie(NULL); cout.tie(NULL);int t;cin >> t;while (t--) {cin >> n >> m;_for(i, 1, n + 1) {_for(j, 1, m + 1) {cin >> maps[i][j];}}_for(i, 1, n + 1) {_for(j, 1, m + 1) {if (maps[i][j] == 'S') {stx = i;sty = j;}else if (maps[i][j] == 'E') {edx = i;edy = j;}}}int res = 0;q = queue<PII>();memset(dist, -1, sizeof dist);memset(vis, -1, sizeof vis);res = bfs();if (res==-1)cout << "oop!" << endl;elsecout << res << endl;}return 0;
}

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



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

相关文章

【AcWing】851. 求最短路

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

【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

AcWing 282. 石子合并

必看的视频讲解↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 【E28【模板】区间DP 石子合并——信息学竞赛算法】 合并过程总开销等于红色数字总和,可以理解为花费的总体力! f数组的含义是f【i】【j】是从第i堆石子开始到第j堆石子的花费体力最小值 如何理解三层for呢? 第一层for是控制区间长度len,第二层for是控制区间起点位置i,第三层for是控制区间

献给正在学习IT专业的朋友们

1.首先请你热爱这个专业。只有这样,你才会从抽象的理论中找到实实在在的快乐。如果 你不热爱她,或者只因为这是个热门专业,那么极力要求你放弃这个专业,因为计算机是 一把双刃剑,学好了你会飞黄腾达,学不好你毕业后会极其痛苦,高不成低不就,没有发 展潜力,如同学英语专业的人到了美国一样。 2.不要用功利眼光对待这个学科,这绝对不是点点鼠标就能挣钱的专业。不要去想做

AcWing 897. 最长公共子序列

动态规划就是多见识应用题就完事儿了,也没有什么好说的。 讲解参考: 【E05 线性DP 最长公共子序列】 #include<iostream>#include<algorithm>#define N 1010using namespace std;char a[N],b[N];int n,m;int f[N][N];int main(){cin >> n >> m >> a

AcWing 2. 01背包问题

一定要看的视频讲解:↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 【E08【模板】背包DP 01背包——信息学竞赛算法】 i表示放入i个物品,j表示第j个物品,用于访问体积v【j】 #include <iostream>#include <algorithm>using namespace std;const int N = 1010;int n, m;int v[N]

AcWing-算法提高课(第一章)-下

区间DP 环形石子合并 状态表示:f[i,j](f[i,j]表示,在,由,将第i堆石子到第j堆石子合并成一堆石子的每个合并方式的代价,组成的集合,中,的最小值)状态计算:f[i,j]=min(f[i,k]+f[k+1,j]+s[j]-s[i-1])(s[j]表示第1堆石子到第j堆石子的总重量,s[i-1]表示第1堆石子到第i-1堆石子的总重量,s[j]-s[i-1]表示第i堆石子到第j堆石子的

献给所有的黑客新手

早已经习惯熬夜的我,今天,我学到很多东西,也明白很多,所以写下此文。 我没有师傅,也没有拜过师,只有老师,是现实生活中遇到的计算机老师,并非网上找的所谓的“高手”,有人问过我,没有师傅怎么学习?难道学习技术就一定要找师傅吗?找师傅你们的条件就是技术好,无非就是多入侵了几个站的,试问他们能帮助你们什么?帮助引导你们犯罪吗?再说高一点,就是一些精通一门甚至几门技术的,他们是真正高手,但是他

贪心推公式——AcWing 125. 耍杂技的牛

贪心推公式 定义 贪心算法是一种在每一步选择中都采取在当前状态下最优的选择,希望通过局部的最优选择来得到全局最优解的算法策略。 运用情况 问题具有最优子结构,即一个问题的最优解包含其子问题的最优解。可以通过局部最优决策逐步推导到全局最优。问题的选择策略相对明确且易于计算。 注意事项 贪心算法并不总是能得到全局最优解,可能会陷入局部最优。对于一些复杂问题,需要谨慎验证其正确性。可能需要对

状态压缩DP——AcWing 291. 蒙德里安的梦想

状态压缩DP 定义 状态压缩DP是一种利用二进制数来表示状态的动态规划算法。它通过将状态压缩成一个整数,从而减少状态数量,提高算法效率。 运用情况 状态压缩DP通常用于解决具有状态转移和最优解性质的问题,例如组合优化、图论、游戏等问题。它的基本思想是将问题的状态表示为一个二进制数,其中每一位表示一个元素或一个状态。通过对二进制数的位运算,可以方便地进行状态转移和最优解的计算。 注意事项