Accept: 122 Submit: 665
Time Limit: 1000 mSec Memory Limit : 32768 KB
Problem Description
小明进入地下迷宫寻找宝藏,找到宝藏后却发生地震,迷宫各处产生岩浆,小明急忙向出口处逃跑。如果丢下宝藏,小明就能迅速离开迷宫,但小明并不想轻易放弃自己的辛苦所得。所以他急忙联系当程序员的朋友你(当然是用手机联系),并告诉你他所面临的情况,希望你能告诉他是否能成功带着宝藏逃脱。
Input
有多组测试数据。
每组测试数据第一行是一个整数T,代表接下去的例子数。(0<=T<=10)
接下来是T组例子。
每组例子第一行是两个整数N和M。代表迷宫的大小有N行M列(0<=N,M<=1000)。
接下来是一个N*M的迷宫描述。
S代表小明的所在地。
E代表出口,出口只有一个。
.代表可以行走的地方。
!代表岩浆的产生地。(这样的地方会有多个,其个数小于等于10000)
#代表迷宫中的墙,其不仅能阻挡小明前进也能阻挡岩浆的蔓延。
小明携带者宝藏每秒只能向周围移动一格,小明不能碰触到岩浆(小明不能和岩浆处在同一格)。
岩浆每秒会向四周不是墙的地方蔓延一格。
小明先移动完成后,岩浆才会蔓延到对应的格子里。
小明能移动到出口,则小明顺利逃脱。
Output
每组测试数据输出只有一行“Yes”或者“No”。 “Yes”代表小明可以成功逃脱。否则输出“No”。
Sample Input
35 5....!S....#....!#...#E...2 2S.!E2 2SE!.
Sample Output
YesNoYes
我这种只会做bfs模版题的渣 这题都不敢碰。。
泽神1A 钱神fb 轩神也过了。。
自己的学习方法还是存在问题 看题解太多了 自己思考太少了
两次bfs 第一次计算出岩浆到达每个点的时间 第二次判断小明是否可以逃脱
AC代码:
#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
#include "queue"
using namespace std;
const int maxn = 1005;
int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};
char map[maxn][maxn];
int n, m, tt[maxn][maxn];
bool vis[maxn][maxn];
struct node
{
/* data */
int x, y, t;
};
bool judge1(int x, int y)
{
if(x >= 0 && x < n && y >= 0 && y < m && tt[x][y] == -1 && map[x][y] != '#')
return true;
return false;
}
bool judge2(int x, int y)
{
if(x >= 0 && x < n && y >= 0 && y < m && !vis[x][y] && map[x][y] != '#')
return true;
return false;
}
void bfs1()
{
queue<node> q;
node f, r;
memset(tt, -1, sizeof(tt));
for(int i = 0; i < n; ++i)
for(int j = 0; j < m; ++j)
if(map[i][j] == '!') {
f.x = i;
f.y = j;
f.t = 0;
tt[i][j] = 0;
q.push(f);
}
int x, y;
while(!q.empty()) {
f = q.front();
q.pop();
for(int i = 0; i < 4; ++i) {
x = f.x + dx[i], y = f.y + dy[i];
if(judge1(x, y)) {
tt[x][y] = f.t + 1;
r.x = x, r.y = y, r.t = tt[x][y];
q.push(r);
}
}
}
}
bool bfs2()
{
queue<node> q;
node f, r;
memset(vis, false, sizeof(vis));
for(int i = 0; i < n; ++i)
for(int j = 0; j < m; ++j)
if(map[i][j] == 'S') {
f.x = i;
f.y = j;
f.t = 0;
vis[i][j] = true;
}
q.push(f);
int x, y;
while(!q.empty()) {
f = q.front();
q.pop();
for(int i = 0; i < 4; ++i) {
x = f.x + dx[i], y = f.y + dy[i];
if(judge2(x, y) && tt[x][y] >= f.t + 1) {
vis[x][y] = true;
if(map[x][y] == 'E') return true;
else if(tt[x][y] != f.t + 1) {
r.x = x, r.y = y, r.t = f.t + 1;
q.push(r);
}
}
}
}
return false;
}
int main(int argc, char const *argv[])
{
int t;
scanf("%d", &t);
while(t--) {
scanf("%d%d", &n, &m);
for(int i = 0; i < n; ++i)
scanf("%s", map[i]);
bfs1();
if(bfs2()) printf("Yes\n");
else printf("No\n");
}
return 0;
}