Gym - 100947H Phobia

2017-02-14  本文已影响0人  Cyril1317

题目大意

其实就是一个女孩面对蟑螂扩张的威胁,要安全的走到她的神器拖鞋那,然后干巴爹~
蟑螂的扩张模式如下:



在时间t如果单元(i,j)被蟑螂占据,则在时间t + 1个单元格(i + 1,j),(i-1,j),(i,j + 1),(i,j- 1)以及单元(i,j)将被蟑螂占据,如果相应的单元格是空的并且在迷宫的边界内。
如果蟑螂扩张另女孩不能成功走到拖鞋那,后果很严重。。

思路

以女孩所在位置BFS一次,找出到拖鞋的最少步数。
再以蟑螂的位置BFS一次,算出蟑螂扩张到拖鞋位置的最短时间。
要注意蟑螂扩张的模式,可能会使女孩在走向拖鞋的过程中无路可走。

输入输出分析

Input

2 //自己数吧~~~
5 5
S..#*
...#.
...##
.....
....X
5 5
S..#*
...#.
...#.
.....
....X

Output

yes
no

上代码

#include <stdio.h>
#include <algorithm>
#include <queue>
#include <string.h>
using namespace std;
#define inf 1111111
int n, m;
char s[105][105];
int vis[105][105];
int dx[4] = {1,-1,0,0};
int dy[4] = {0,0,1,-1};

struct land{
    int x, y;
    int step;
};

int bfs(int xx, int yy)
{
    int i, r, c;
    land now; //在内部定义!!!!
    memset(vis, 0, sizeof(vis));
    queue <land> q;  //建立队列
    while(!q.empty()) //清空队列
        q.pop();
    now.x = xx;
    now.y = yy;
    now.step = 0;
    q.push(now); //入队
    vis[xx][yy] = 1;
    while(!q.empty()) //队列非空
    {
        land next;
        now = q.front();
        q.pop();
        if(s[now.x][now.y]=='X') return now.step; //到达,返回步数
        for(i = 0; i < 4; i++) //搜索
        {
            r = now.x + dx[i];
            c = now.y + dy[i];
            if(r>=0 && r<n && c>=0 && c<m && !vis[r][c] && (s[r][c]=='.'|| s[r][c]=='X')) //是否通行
            {
                vis[r][c] = 1;
                next.x = r;
                next.y = c;
                next.step = now.step + 1;
                q.push(next);
            }
        }
    }
    return inf;
}



int main (void)
{
    int t, i, j, sp1, sp2;
    scanf("%d", &t);
    while(t--)
    {
        scanf("%d %d", &n, &m);
        for(i = 0; i < n; i++)
            scanf("%s", s[i]);
        land st, h;
        sp1 = inf;
        sp2 = inf;
        for(i = 0; i < n; i++)
        {
            for(j = 0; j < m; j++)
            {
                if(s[i][j] == '*')
                {
                    sp1 = min(sp1, bfs(i,j));
                }
                if(s[i][j] == 'S')
                {
                    sp2 = min(sp2, bfs(i,j));
                }
            }
        }
        if(sp2 < sp1) printf("yes\n");
        else printf("no\n");
    }
    return 0;
}
上一篇下一篇

猜你喜欢

热点阅读