美文网首页
Gym - 100947H Phobia

Gym - 100947H Phobia

作者: Cyril1317 | 来源:发表于2017-02-14 23:46 被阅读0次

    题目大意

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



    在时间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;
    }
    

    相关文章

      网友评论

          本文标题:Gym - 100947H Phobia

          本文链接:https://www.haomeiwen.com/subject/nhvfwttx.html