D. Solve The Maze(BFS+思维)
Problem - 1365D - Codeforces
题意:
题意:就是有一个n*m的迷宫,里面有若干个好人(用G表示)以及若干个坏人(用B)表示,还有若干个墙(用#表示),墙的方块不能行走,人只能往上下左右四个方向行走,可以在某些空白位置设置一些墙,使得坏人到达不了点(n,m),好人能够全部到达(n,m)。
可以保证(n,m)单元格是空的。Vivek也可以封锁这个单元。
一个人只有在一个单元格与他当前的单元格有相同的边并且不包含墙的情况下才能移动到该单元格。维维克想用墙来堵住一些空牢房,这样一来,所有的好人都能逃脱,而坏人则无法逃脱。最初包含 "G "或 "B "的牢房不能被封锁,可以被穿越。
另外可能有多个G,B
输入
第一行包含一个整数t(1≤t≤100)--测试案例的数量。测试用例的描述如下。
每个测试案例的第一行包含两个整数n,m(1≤n,m≤50)--迷宫中的行和列的数量。
接下来的n行各包含m个字符。它们描述了迷宫的布局。如果某行的一个字符等于'.',则相应的单元格为空。如果它等于'#',则该单元格有一堵墙。G "对应于一个好人,"B "对应于一个坏人。
输出
对于每个测试案例,如果存在一种方法可以用墙代替一些空单元格以满足给定条件,则打印 "是"。否则打印 "No"。
你可以在任何情况下打印每个字母(大写或小写)。
思路:
这是div2的D题,已经稍微有点难度了,实际上仔细想一下也没那么难,我们就考虑在坏人的四周围上墙,然后要是有好人在坏人的四周,那么直接就输出NO,因为无论好人怎么走,坏人都可以跟着好人走下去。然后在把所有的坏人都围上之后,就可以bfs遍历,但是我们从每个好人开始遍历时间复杂度又过高,所以我们就从终点开始bfs搜索,看是否能遍历到所有的好人
本题收获:遇到多个点到某一个点,可以考虑反过来一到多(BFS)
很重要的思想
#include <cstring>
#include <iostream>
#include <map>
#include <algorithm>
#include <vector>
#include<queue>
using namespace std;
char mp[60][60];
vector<pair<int,int>> q;
int f,n,m;
int dx[4]={1,-1,0,0};
int dy[4]={0,0,-1,1};
int vis[60][60];
void bfs()
{queue<pair<int,int>> p;memset(vis,0,sizeof vis);p.push({n,m});if(mp[n][m]=='#'){return ;}vis[n][m] = 1;while(p.size()){auto k = p.front();p.pop();int nx = k.first,ny = k.second;for(int i = 0;i <= 3;i++){int px = nx+dx[i];int py = ny+dy[i];if(px>=1&&px<=n&&py>=1&&py<=m&&!vis[px][py]&&mp[px][py]!='#'){vis[px][py] = 1;p.push({px,py});} }}
}int main()
{int t;cin >> t;while(t--){cin >> n>> m;f = 0;memset(mp,0,sizeof mp);for(int i = 1;i <= n;i++){for(int j = 1;j <= m;j++){cin >> mp[i][j];}}for(int i = 1;i <= n;i++){for(int j = 1;j <= m;j++){if(mp[i][j]=='B'&&(mp[i+1][j]=='G'||mp[i-1][j]=='G'||mp[i][j+1]=='G'||mp[i][j-1]=='G')){f = 1;}if(mp[i][j]=='B'){if(mp[i+1][j]=='.'){mp[i+1][j]='#';}if(mp[i-1][j]=='.'){mp[i-1][j]='#';}if(mp[i][j+1]=='.'){mp[i][j+1]='#';}if(mp[i][j-1]=='.'){mp[i][j-1]='#';}}}}if(f){cout<<"NO\n";continue;}bfs();f = 0;for(int i = 1;i <= n;i++){for(int j = 1;j <= m;j++){if(mp[i][j]=='G'){if(vis[i][j]){continue;}elsef = 1;}}}if(f){cout<<"NO\n";}else{cout<<"YES\n";}// cout<<mp[n][m]<<"\n";}
}
D. Solve The Maze(BFS+思维)相关推荐
- D. Solve The Maze Codeforces Round #648 (Div. 2)
D. Solve The Maze Vivek has encountered a problem. He has a maze that can be represented as an n×m g ...
- HDU3713 Double Maze(BFS)
题目链接: https://cn.vjudge.net/problem/18676/origin Problem Description Unlike single maze, double maze ...
- 2020CCPC(威海) - Labyrinth(bfs+思维)
题目大意:给出一个 n * m 的矩阵,在矩阵内部最有 k 个黑洞(表示不可行走的区域),现在给出 q 次询问,每次询问给出两个点 ( x1 , y1 ) 和 ( x2 , y2 ) ,问从点 ( x ...
- Solve The Maze CodeForces - 1365D(贪心+dfs)
Vivek has encountered a problem. He has a maze that can be represented as an n×m grid. Each of the g ...
- hdu 5094 Maze bfs
传送门:上海邀请赛E 给定一个n×m的迷宫,给出相邻格子之间的墙或者门的信息,墙说明不可走,假设是门则须要有相应的钥匙才干通过,问是否可以从(1,1)到达(n,m) 一个带状态的bfs,再另记一个状态 ...
- 一道神坑题 POJ3026 Borg Maze BFS+prim算法
题意不说 附上链接 http://poj.org/problem?id=3026 反正先用BFS搜一遍图 记录 S和A之间的路 用一个二维数组存储 (注意 把每个S或者A 都搜一遍) 好了 剩下的就是 ...
- CodeForces - 1293C NEKO's Maze Game(思维,水题)
题目链接:点击查看 题目大意:给出一个2*n大小的矩阵,现在有m次操作,每次操作将某一个方格的状态置反,这里的每个方块都有两种状态,一种状态是可通行状态,另一种是不可通行状态,初始时所有方块都是可通行 ...
- Codeforces Round #619 (Div. 2) F. Super Jaber 多源bfs + 思维转换
传送门 文章目录 题意: 思路: 题意: 给你一个矩阵,每个格子都有一个颜色kkk,每秒可以移动到相邻矩阵或者瞬移到同一颜色的任意矩阵.有qqq个询问,每次询问给出两个点,求从一个点到另一个点的最短时 ...
- codeforces D. Solve The Maze
题目 题意: 你有一个地图,总共有 4 4 4种符号,'.','#',' G G G',' B B B',分别代表着路,墙,好人,坏人,现在你可以将路变成墙,问最后是否有一种方案使得坏人走不到 n , ...
最新文章
- vue 结合 echarts
- IT十八掌作业_java基础第十六天_GUI/socket
- Django中的缓存的配置与使用
- Java 线程的生命周期
- php在什么方面使用使用队列,你知道在什么情况下使用队列吗?
- 使用JMeter创建数据库(Mysql)测试
- 【每日SQL打卡】​​​​​​​​​​​​​​​DAY 7丨字节面试真题【难度困难】
- 给网页标题添加icon小图标
- GraphQL —— 标量类型
- 北京移动联合中兴通讯率先完成SON 4/5G全制式规模部署
- linux下使用source /etc/profile保存配置后,新的环境变量只能在一个终端里面有效...
- Equals Finalize GetHashCode GetType MemberwiseClone ReferenceEquals ToString String.IsInterned
- 用CLSID_FilterGraph+TV卡实现视频采集
- 学习笔记(1):C#Winform水晶报表实例教程-设计带图片的水晶报表
- Supervisor管理hive服务(metastore,hiveserver2),防止意外杀死Hive服务,导致任务中断
- PHP EOF使用说明
- Java利用Set集合去重复
- 嵌入式实时操作系统FOS简介
- Messager for grace
- WPF 设置纯软件渲染