Codeforces 1365D Solve The Maze
### 题目大意:
在一个 $n * m$ 的矩阵中,有空地、坏人、好人和墙。你可以将空地变成墙来堵住坏人。$(n, m)$为出口,是否存在一个方案使得矩阵中所有好人能够走到出口,而所有坏人不能通过出口,相应的输出$Yes$ 和 $No$。
### 思路:
1.预处理:如果坏人和好人相邻,那么坏人一定可以走到隔壁好人,再通过好人的路径走到终点,所以不符合, 输出$No$;
如果当前方格为坏人,我们只有将他四周都堵住,他才能不会走到出口, 即将周围空地变成墙。
2.试想一下,如何挨个判断好人是否能走到出口,是不是太麻烦了,那么反过来想,判断出口$(n, m)$能走到哪些好人方格则只用做一次$bfs$或者$dfs$,如果能走则标记一下。
### 代码:
```cpp
#include
using namespace std;
typedef pair PII;
const int N = 55;
int n, m;
char a[N][N];
bool st[N][N];
int flag = 1, dx[4] = {-1, 1, 0, 0}, dy[4] = {0, 0, -1, 1};
void dfs(int sx, int sy){
for(int i = 0; i < 4; i++){
int x = sx + dx[i], y = sy + dy[i];
if(x >= 1 && x <= n && y >= 1 && y <= m){
if(a[x][y] == 'G') flag = 0;
if(a[x][y] == '.') a[x][y] = '#';
}
}
}
void bfs(int sx, int sy){
queue q;
q.push({sx, sy});
while(q.size()){
PII t = q.front();
q.pop();
for(int i = 0; i < 4; i++){
int x = t.first + dx[i], y = t.second + dy[i];
if(a[x][y] == '#' || st[x][y]) continue;
if(x >= 1 && x <= n && y >= 1 && y <= m){
st[x][y] = true;
q.push({x, y});
}
}
}
}
int main(){
int T;
cin >> T;
while(T--){
flag = 1;
cin >> n >> m;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
cin >> a[i][j];
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++){
if(a[i][j] == 'B')
dfs(i, j);
}
memset(st, 0, sizeof st);
if(a[n][m] != '#') bfs(n, m);
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++){
if(a[i][j] == 'G'){
if(st[i][j] == false) flag = 0;
}
}
if(flag) cout << "Yes" << endl;
else cout << "No" << endl;
}
return 0;
}
```
Codeforces 1365D Solve The Maze的更多相关文章
- Codeforces Round #648 (Div. 2) D. Solve The Maze
这题犯了一个很严重的错误,bfs 应该在入队操作的同时标记访问,而不是每次只标记取出的队首元素. 题目链接:https://codeforces.com/contest/1365/problem/D ...
- [CodeForces - 197D] D - Infinite Maze
D - Infinite Maze We've got a rectangular n × m-cell maze. Each cell is either passable, or is a wal ...
- 【codeforces 196B】Infinite Maze
[题目链接]:http://codeforces.com/problemset/problem/196/B [题意] 给你一个n*m的棋盘; 然后你能够无限复制这个棋盘; 在这个棋盘上你有一个起点s; ...
- CodeForces 1292A NEKO's Maze Game(思维)
#include <stdio.h> #include <string.h> #include <iostream> #include <string> ...
- 图-用DFS求连通块- UVa 1103和用BFS求最短路-UVa816。
这道题目甚长, 代码也是甚长, 但是思路却不是太难.然而有好多代码实现的细节, 确是十分的巧妙. 对代码阅读能力, 代码理解能力, 代码实现能力, 代码实现技巧, DFS方法都大有裨益, 敬请有兴趣者 ...
- L - Abbott's Revenge(比较复杂的bfs)
Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit Status Practice UV ...
- UVa816 Abbott's Revenge
Abbott's Revenge Time limit: 3.000 seconds Abbott’s Revenge Abbott’s Revenge The 1999 World FinalsC ...
- UVA10384-The Wall Pushers(迭代加深搜索)
Problem UVA10384-The Wall Pushers Accept: 199 Submit: 1546Time Limit: 10000 mSec Problem Descripti ...
- 迷宫问题的C语言求解
1 .Preface /** * There have been many data to introduce the algorithm. So I will try to simply expla ...
随机推荐
- Typhoon靶机
仅供个人娱乐 靶机信息 靶机下载地址:https://www.vulnhub.com/entry/typhoon-102,267/ 一.主机探测 arp-scan -l nmap -sV -p- -A ...
- Netty基础招式——ChannelHandler的最佳实践
本文是Netty系列第7篇 上一篇文章我们深入学习了Netty逻辑架构中的核心组件EventLoop和EventLoopGroup,掌握了Netty的线程模型,并且介绍了Netty4线程模型中的无锁串 ...
- JavaGUI三种布局管理器FlowLayout,BorderLayout,GridLayout的使用
三种布局管理器 流式布局FlowLayout package GUI; import java.awt.*; import java.awt.event.WindowAdapter; import j ...
- [SQL]修改和删除基本表
修改基本表 SQL语言用alter table语句修改基本表,其一般格式如下: alter table <表名> add <列名> <数据类型> [<列级完整 ...
- [C++]-string类的常用操作
代码 #include<iostream> #include<string> #include<algorithm> using namespace std; in ...
- 用三个while循环和tkinter实现一个显示屏
用三个while循环和tkinter实现一个显示屏 import tkinter as tk import time # 输入框是跟程序打交道的一个途径,例如程序要求你输入账号密码,那么它就需要提供两 ...
- K8s 部署 Gitlab CI Runner
K8s 版本:1.20.6 GitLab CI 最大的作用是管理各个项目的构建状态.因此,运行构建任务这种浪费资源的事情交给一个独立的 Gitlab Runner 来做就会好很多,而且 Gitlab ...
- 题解 Defence
传送门 发现最少次数只和最左,最右及中间最长的全0段有关 本来想启发式合并,结果发现直接线段树合并搭配一个类似山海经的方法就可以过了 yysy,线段树单次合并的具体复杂度并不是 \(O(logn)\) ...
- 虚拟机下安装Centos设置静态ip,并通过桥接连接
Centos7.6设置静态IP 1.CentOS7默认网卡设备文件存放于该目录下 /etc/sysconfig/network-scripts/ 网卡设备默认的名字为:ifcfg-ens33 查看网卡 ...
- null的坑 和 比较运算符、相等运算符的隐式转换问题 (在javascript中,null>=0 为真,null<=0 为真,null==0却为假,null到底是什么?)
null在关系运算中的坑 & 关系运算符的隐式转换问题 注意: 比较运算符 和 相等运算符 的 ECMAscript 语法实现不同. 比较运算符 和 相等运算符 对数据进行了隐式转换, 相当于 ...