链接:https://www.nowcoder.com/acm/contest/96/G

来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒

空间限制:C/C++ 32768K,其他语言65536K

64bit IO Format: %lld

题目描述

给你一个n*m的图,地图上’.’代表可以走的地方,而’#’代表陷阱不能走,

‘P’代表人物位置,’K’代表钥匙,’E’代表出口。人物一个,钥匙有多个,

(’K’的数量<=50)),出口一个,每个位置可以向(上,下,左,右)四个

方向走一格,花费一个单位时间,现在你需要花费最少的时间拿到钥匙

然后从迷宫的出口出去(若没有钥匙,则不能进入迷宫出口所在的格子)。

输入描述:

第一行一个整数T(T <= 50),代表数据的组数

接下来一行n,m(n<=500,m<=500),代表地图的行和列

接下来n行,每行一个长度为m的字符串,组成一个图。

输出描述:

如果可以出去,输出所花费的最少时间。

如果不能出去,输出一行”No solution”。

示例1

输入

3
5 5
....P
##..E
K#...
##...
.....
5 5
P....
.....
..E..
.....
....K
5 5
P#..E
.#.#.
.#.#.
.#.#.
...#K

输出

No solution

12

No solution

思路

两次BFS

第一次BFS 求 入口 到每个钥匙的最短步数 存下来

第二次BFS 求 出口 到每个钥匙的最短步数 存下来

如果 钥匙存在的地方 到入口和到出口都可行 那么 这个答案就是可行的

找出 所有可行的答案 去最小值

AC代码

#include <cstdio>
#include <cstring>
#include <ctype.h>
#include <cstdlib>
#include <cmath>
#include <climits>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <map>
#include <stack>
#include <set>
#include <list>
#include <numeric>
#include <sstream>
#include <iomanip>
#include <limits> #define CLR(a, b) memset(a, (b), sizeof(a))
#define pb push_back using namespace std;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
typedef pair <int, int> pii;
typedef pair <ll, ll> pll;
typedef pair<string, int> psi;
typedef pair<string, string> pss; const double PI = acos(-1.0);
const double E = exp(1.0);
const double eps = 1e-8; const int INF = 0x3f3f3f3f;
const int maxn = 5e2 + 5;
const int MOD = 1e9; int G[maxn][maxn]; // K 2
int v[maxn][maxn];
int k[maxn][maxn]; int px, py, ex, ey; int ans; int n, m; int Move[4][2] =
{
-1, 0,
1, 0,
0,-1,
0, 1,
}; struct node
{
int x, y, step;
}; bool ok(int x, int y)
{
if (x < 0 || x >= n || y < 0 || y >= m || G[x][y] == 0 || v[x][y])
return false;
return true;
} void bfs(int x, int y, int flag)
{
CLR(v, 0);
queue <node> q;
node tmp;
tmp.x = x;
tmp.y = y;
tmp.step = 0;
q.push(tmp);
v[tmp.x][tmp.y] = 1;
while (!q.empty())
{
node u = q.front(), w;
q.pop();
if (G[u.x][u.y] == 2)
{
if (flag)
{
if (k[u.x][u.y] == -1)
return;
else
ans = min(ans, k[u.x][u.y] + u.step);
}
else
{
k[u.x][u.y] = u.step;
}
}
for (int i = 0; i < 4; i++)
{
w.x = u.x + Move[i][0];
w.y = u.y + Move[i][1];
w.step = u.step + 1;
if (ok(w.x, w.y))
{
q.push(w);
v[w.x][w.y] = 1;
}
}
}
} int main()
{
int t;
cin >> t;
while (t--)
{
scanf("%d%d", &n, &m);
char c;
CLR(k, -1);
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
scanf(" %c", &c);
if (c == '#')
G[i][j] = 0;
else
{
G[i][j] = 1;
if (c == 'P')
px = i, py = j;
else if (c == 'E')
ex = i, ey = j;
else if (c == 'K')
G[i][j] = 2;
}
}
}
ans = INF;
G[ex][ey] = 0;
bfs(px, py, 0);
G[ex][ey] = 1;
bfs(ex, ey, 1);
if (ans == INF)
printf("No solution\n");
else
cout << ans << endl;
}
}

2018年长沙理工大学第十三届程序设计竞赛 G 逃离迷宫 【BFS】的更多相关文章

  1. H-数学考试 想法题+最新头文件 2018年长沙理工大学第十三届程序设计竞赛

    https://www.nowcoder.com/acm/contest/96/H 坑点:INF开太小了... #define _CRT_SECURE_NO_WARNINGS #include< ...

  2. 2018年长沙理工大学第十三届程序设计竞赛 E小木乃伊到我家(spfa模版)

    链接:https://www.nowcoder.com/acm/contest/96/E来源:牛客网 小木乃伊到我家 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他 ...

  3. 2018年长沙理工大学第十三届程序设计竞赛 J杯子

    链接:https://www.nowcoder.com/acm/contest/96/J来源:牛客网 杯子 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言655 ...

  4. 2018年长沙理工大学第十三届程序设计竞赛 H数学考试

    链接:https://www.nowcoder.com/acm/contest/96/H来源:牛客网 数学考试 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言6 ...

  5. 2018年长沙理工大学第十三届程序设计竞赛 Dzzq的离散数学教室1

    Dzzq的离散数学教室1 链接:https://www.nowcoder.com/acm/contest/96/D来源:牛客网 zzq的离散数学教室1 时间限制:C/C++ 1秒,其他语言2秒 空间限 ...

  6. 2018年长沙理工大学第十三届程序设计竞赛 C 取手机 【概率】

    链接:https://www.nowcoder.com/acm/contest/96/C 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536 ...

  7. 2018年长沙理工大学第十三届程序设计竞赛 E 小木乃伊到我家 【最短路】

    时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit IO Format: %lld 题目描述 AA的欧尼酱qwb是个考古学家,有一天qwb发 ...

  8. 2018年长沙理工大学第十三届程序设计竞赛 I 连续区间的最大公约数

    连续区间的最大公约数 思路:参照BZOJ 4488: [Jsoi2015]最大公约数脑补出的一个\(map\)套\(vector\)的写法,写起来比线段树短,运行时间比线段树快. 代码: #pragm ...

  9. 哈尔滨理工大学第七届程序设计竞赛初赛(BFS多队列顺序)

    哈尔滨理工大学第七届程序设计竞赛初赛https://www.nowcoder.com/acm/contest/28#question D题wa了半天....(真真正正的半天) 其实D题本来就是一个简单 ...

随机推荐

  1. 【Shell】Read命令

    read命令从键盘读取变量的值,通常用在shell脚本与用户进行交互的场合.该命令可以一次性读取多个变量的值,变量的输入和输出需要使用空格隔开.在read命令后面,如果没有指定变量名,读取的数据将被自 ...

  2. Oracle 重置序列

    Oracle将自增sequence重置为初始值1时,若是删除再重建,那么依赖它的函数和存储过程将失效,需要重新编译. 这里利用相反的过程,利用负值步长参数,将递增值改为(sequence.NEXTVA ...

  3. sqlserver 中EXEC和sp_executesql使用介绍

    sqlserver 中EXEC和sp_executesql使用介绍 MSSQL为我们提供了两种动态运行SQL语句的命令,各自是EXEC和sp_executesql;通常,sp_executesql则更 ...

  4. 如何在 Linux 中找到你的 公网IP 地址

    每个网站都有一个独有的公开 IP 地址,可供任何人从任何地方访问. 互联网协议Internet Protocol(IP)不需要介绍 —— 我们每天都在使用它.即使你不直接使用它,当你在浏览器上输入 w ...

  5. Security Testing Basics

    Security Testing BasicsSoftware security testing is the process of assessing and testing a system to ...

  6. [译]GLUT教程 - 整合代码7

    Lighthouse3d.com >> GLUT Tutorial >> Extras >> The Code So Far VII 以下是子窗体的最终版本代码. ...

  7. who 查看系统登录用户

    who  查看所有登录用户 whoami   查看自己的登陆名 w users last

  8. SQL之经典语句

    一.基础 1.说明:创建数据库 CREATE DATABASE database-name 2.说明:删除数据库 drop database dbname 3.说明:备份sql server --- ...

  9. NFS网络文件系统服务(配置实战)

    NFS网络文件系统服务(实战) NFS(Network File System)即网络文件系统,它允许网络中的计算机之间通过TCP/IP网络共享资源.让不同的主机系统(NFS的客户端)可以透明地读写位 ...

  10. Spring WebSocket Support官方文档+翻译

    实时更新技术能够应用在很多场景中,比如在浏览器中聊天.股票报价.状态更新.现场直播.这些需求对时间的延迟性都很敏感,但是我们可以发现他们存在这共有的共性. 标准的HTTP请求,是一次请求对应一次相应. ...