题面

考虑双向广搜。

我们需要记录男孩和女孩的当前位置,并且每次都进行扩展。

记录一个数组 \(st[i][j]\) 。

  • 如果 \(st[i][j]=0\) ,说明 \((i,j)\) 还没有被男孩和女孩经过;
  • 如果 \(st[i][j]=1\) ,说明 \((i,j)\) 被男孩经过了;
  • 如果 \(st[i][j]=2\) ,说明 \((i,j)\) 被女孩经过了。

如果当前扩展的是男孩,且当前的位置是 \((x,y)\) ,那么当 \(st[x][y]=2\) 时直接返回当前扩展的层数即可;

如果当前扩展的是女孩,那么当 \(st[x][y]=1\) 时直接返回就可以了。

题目中有一句话:

在第 \(k\) 秒后所有与鬼的曼哈顿距离不超过 \(2k\) 的位置都会被鬼占领。

我们根据这句话的提示判断该点是否要扩展即可。

其实双队列来实现双向广搜还是比较易懂的。

#include <bits/stdc++.h>
#define DEBUG fprintf(stderr, "Passing [%s] line %d\n", __FUNCTION__, __LINE__)
#define itn int
#define gI gi using namespace std; inline int gi()
{
int f = 1, x = 0; char c = getchar();
while (c < '0' || c > '9') {if (c == '-') f = -1; c = getchar();}
while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return f * x;
} const int maxn = 803; int t, n, m;
char s[maxn][maxn];
int st[maxn][maxn];
pair <int, int> boy, girl, ghost[5]; const int dx[] = {0, 1, 0, -1}, dy[] = {1, 0, -1, 0}; inline bool check(int x, int y, int step)
{
if (x <= 0 || x > n || y <= 0 || y > n || s[x][y] == 'X') return false; //出界了或者走到了墙
for (int i = 1; i <= 2; i+=1)
if (abs(x - ghost[i].first) + abs(y - ghost[i].second) <= step * 2) return false; //判断与鬼的曼哈顿距离
return true;
} inline int bfs()
{
memset(st, 0, sizeof(st)); //记得数组初始化
queue <pair <int, int> > qb, qg;
int tot = 0;
for (int i = 1; i <= n; i+=1)
{
for (int j = 1; j <= m; j+=1)
{
if (s[i][j] == 'M') boy = (make_pair)(i, j);
else if (s[i][j] == 'G') girl = (make_pair)(i, j);
else if (s[i][j] == 'Z') ghost[++tot] = (make_pair)(i, j);
//记录男孩、女孩和鬼的位置
}
}
qb.push(boy); qg.push(girl);
int step = 0; //扩展的层数
while (qb.size() || qg.size()) //如果还可以扩展
{
++step;
for (int i = 1; i <= 3; i+=1) //男孩扩展 3 步
{
for (int j = 1, len = qb.size(); j <= len; j+=1) //要对队列中的每一个元素进行扩展
{
pair <int, int> p = qb.front(); qb.pop();
int x = p.first, y = p.second;
if (!check(x, y, step)) continue;
for (int k = 0; k < 4; k+=1)
{
int xx = x + dx[k], yy = y + dy[k];
if (!check(xx, yy, step)) continue;
if (st[xx][yy] == 2) return step;
if (!st[xx][yy])
st[xx][yy] = 1, qb.push((make_pair)(xx, yy));
}
}
}
for (int i = 1; i <= 1; i+=1) //女孩只要扩展一步
{
for (int j = 1, len = qg.size(); j <= len; j+=1)
{
pair <int, int> p = qg.front(); qg.pop();
int x = p.first, y = p.second;
if (!check(x, y, step)) continue;
for (int k = 0; k < 4; k+=1)
{
int xx = x + dx[k], yy = y + dy[k];
if (!check(xx, yy, step)) continue;
if (st[xx][yy] == 1) return step;
if (!st[xx][yy])
st[xx][yy] = 2, qg.push((make_pair)(xx, yy));
}
}
}
}
return -1; //无解
} int main()
{
//freopen(".in", "r", stdin);
//freopen(".out", "w", stdout);
t = gi();
while (t--)
{
n = gi(), m = gi();
for (int i = 1; i <= n; i+=1) scanf("%s", s[i] + 1);
printf("%d\n", bfs());
}
return 0;
}

题解【AcWing177】噩梦的更多相关文章

  1. HDU 3085 Nightmare Ⅱ(噩梦 Ⅱ)

    HDU 3085 Nightmare Ⅱ(噩梦 Ⅱ) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Ja ...

  2. 【CSP-S膜你考】不怕噩梦 (模拟)

    不怕噩梦 题面 蚊子最近经常做噩梦,然后就会被吓醒.这可不好.. 疯子一直在发愁,然后突然有一天,他发现蚊子其实就是害怕某些事. 如果那些事出现在她的梦里,就会害怕. 我们可以假定那个害怕的事其实是一 ...

  3. [CQOI2012]模拟工厂 题解(搜索+贪心)

    [CQOI2012]模拟工厂 题解(搜索+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1327574 链接题目地址:洛谷P3161 BZOJ P26 ...

  4. 洛谷P1484 种树&洛谷P3620 [APIO/CTSC 2007]数据备份 题解(堆+贪心)

    洛谷P1484 种树&洛谷P3620 [APIO/CTSC 2007]数据备份 题解(堆+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/132 ...

  5. web前端的春天 or 噩梦

    「 微信应用号可以做什么」 简单说,微信"小程序"可以为开发者提供基于微信的表单.导航.地图.媒体和位置等开发组件,让他们在微信的网页里构建一个 HTML 5 应用.同时微信还开放 ...

  6. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  7. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  8. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  9. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

随机推荐

  1. minio gateway 代理s3 存储

    以前有写过使用minio gataway 代理nas 的,实际上还可以代理s3 ,hdfs....,以下是一个gatway 带来nas 以及s3 集成的模式 环境准备 docker-compose文件 ...

  2. 将Chrome浏览器中的扩展程序导出为crx插件文件

    将Chrome浏览器中安装的插件程序导出为crx插件文件 以360急速浏览器为例进行导出crx插件程序 1.在Chrom商店中找到需要的插件,安装到浏览器的扩展程序里面()IDM Integratio ...

  3. java使用原生MySQL实现数据的增删改查以及数据库连接池技术

    一.工具类及配置文件准备工作 1.1 引入jar包 使用原生MySQL,只需要用到MySQL连接的jar包,maven引用方式如下: <dependency> <groupId> ...

  4. NAS之NFS/CIFS

    NAS之NFS 为集群中的 Web Server 配置后端存储 NFS:Network File System 网络文件系统,Unix系统之间共享文件的一种协议NFS 的客户端主要为Linux支持多节 ...

  5. 剑指offer-面试题44-数字序列中某一位的数字-脑筋急转弯

    /* 题目: 数字以0123456789101112131415…的格式序列化到一个字符序列中. 在这个序列中,第5位(从0开始计数,即从第0位开始)是5,第13位是1,第19位是4,等等. 请写一个 ...

  6. IntelliJ IDEA 2018.3.2 永久破解

    PS:动手能力强的来,手残的去淘宝买吧,大概15块钱1年.建议看完后在动手,有一个全局观,浪费不了多少时间 一. 下载破解补丁文件 链接:https://pan.baidu.com/s/1wFp14t ...

  7. Wannafly Winter Camp 2020 Day 6A Convolution - NTT

    求 \(\sum_{i=1}^n \sum_{j=1}^n 2^{a_ia_j}\) Solution 化简一下 \[ 2^{a_ia_j} = p^{(a_i+a_j)^2-a_i^2-a_j^2} ...

  8. Pikachu-Sql Inject(SQL注入)

    在owasp发布的top10排行榜里,注入漏洞一直是危害排名第一的漏洞,其中注入漏洞里面首当其冲的就是数据库注入漏洞.一个严重的SQL注入漏洞,可能会直接导致一家公司破产!SQL注入漏洞主要形成的原因 ...

  9. web端常见测试

    一.登录注册功能 1.页面调转 2.tab键与enter键 3.密码加密显示,是否支持复制粘贴 4.账号密码校验 5.刷新页面,更新验证码 二.界面测试 1.样式.颜色.整体布局风格 2.最大化.最小 ...

  10. Miller_Rabin()算法素数判定 +ollard_rho 算法进行质因数分解

    //****************************************************************// Miller_Rabin 算法进行素数测试//速度快,而且可以 ...