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 125. 耍杂技的牛

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

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

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

AcWing算法基础课笔记——高斯消元

高斯消元 用来求解方程组 a 11 x 1 + a 12 x 2 + ⋯ + a 1 n x n = b 1 a 21 x 1 + a 22 x 2 + ⋯ + a 2 n x n = b 2 … a n 1 x 1 + a n 2 x 2 + ⋯ + a n n x n = b n a_{11} x_1 + a_{12} x_2 + \dots + a_{1n} x_n = b_1\\ a_

AcWing 1801:蹄子剪刀布 ← 模拟题

【题目来源】https://www.acwing.com/problem/content/1803/【题目描述】 你可能听说过“石头剪刀布”的游戏。 这个游戏在牛当中同样流行,它们称之为“蹄子剪刀布”。 游戏的规则非常简单,两头牛相互对抗,数到三之后各出一个表示蹄子,剪刀或布的手势。蹄子赢剪刀,剪刀赢布,布赢蹄子。 例如,第一头牛出“蹄子”手势,第二头牛出“布”手势,则第二头牛获胜。 如果两头牛出

数位统计DP——AcWing 338. 计数问题

数位统计DP 定义 数位DP(Digital DP)是一种用于解决与数字的数位相关问题的动态规划算法。它将数字的每一位看作一个状态,通过转移状态来计算满足特定条件的数字个数或其他相关统计信息。 运用情况 统计满足特定条件的数字个数,例如在给定范围内有多少个数字满足某些数位特征。计算数字的某个数位上的特定统计信息,如出现的数字频率等。解决与数字排列、组合相关的问题。 注意事项 数位DP的

练习1101

//查找介于n1与n2之间( 0<n1<n2<32768 )之间所有满足下列条件的整数 //1,该数的十进制表示中有且仅有相同的两个数 //2,该数为素数 //现判断条件1,然后在条件1的函数中判断条件2 #include <stdio.h> void compare (int x , int y );//该函数判断是否有两个相同的数 void pr

程序员真的是吃青春饭的吗?(献给即将进入职场的程序员们)--------非原著

又有学生问我:程序员真的是吃青春饭的吗?我是不是做到三十岁就该考虑转型了? 我告诉他们: 这是中国的记者们用统计数字造下的一个弥天大谎,当我们看到微软集团内的许多白发程序员在兢兢业业地工作的时候,我们又用"观念"来说明中国的程序员吃青春饭的原因。实际上,不仅美国的微软,甲骨文,Adobe,暴雪,在中国的金山,寰宇,腾讯,盛大,都有或者将要有年龄很大的程序员,关键是他们做的东西和那些"挨

中国剩余定理——AcWing 204. 表达整数的奇怪方式

中国剩余定理 定义 中国剩余定理最早出自我国古代的《孙子算经》,是数论中的一个重要定理。它描述了这样一种情况:在模运算下,对于一组线性同余方程组,存在唯一解的条件和求解方法。 运用情况 常用于在一些涉及到按不同模的余数条件下求解问题。比如在密码学、计算数论、计算机科学等领域中,当需要处理多个模条件相关的计算时,常常会用到中国剩余定理。 注意事项 要求各个模之间互质,否则定理不直接适用,

计数类DP——AcWing 900. 整数划分

计数类DP 定义 计数类DP主要是通过动态规划的方法来计算满足特定条件的方案数、组合数等数量相关的问题。 运用情况 需要计算不同排列、组合或情况的数量。问题具有明显的阶段性,且每个阶段的选择会对后续阶段产生影响。可以通过逐步构建较小规模问题的解来推导出大规模问题的解。 注意事项 状态定义要准确合理,确保能够涵盖所有需要计数的情况。边界条件的处理要小心,避免出现错误。注意状态转移的正确性

AcWing 1273:天才的记忆 ← ST算法求解RMQ问题

【题目来源】https://www.acwing.com/problem/content/1275/【题目描述】 从前有个人名叫 WNB,他有着天才般的记忆力,他珍藏了许多许多的宝藏。 在他离世之后留给后人一个难题(专门考验记忆力的啊!),如果谁能轻松回答出这个问题,便可以继承他的宝藏。 题目是这样的:给你一大串数字(编号为 1 到 N,大小可不一定哦!),在你看过一遍之后,它便消失在你面前,随后