zoukankan      html  css  js  c++  java
  • 牛客 2018年长沙理工大学第十三届程序设计竞赛 G-逃离迷宫

    链接: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.从起点P搜到终点E,再开一个数组vis[i][j][t],
    vis[i][j][0]表示从起点到点(i,j)未经过是'K'的点()即未拿到钥匙,
    vis[i][j][1]表示拿到钥匙,然后BFS即可。


    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<queue>
    using namespace std;
    int N,M;
    char map[503][503];
    int vis[502][502][2];
    int d[4][2]={0,1,0,-1,1,0,-1,0};
    struct Node{
        int x,y;
        int f;
    };
    int bfs(int x,int y)
    {
        memset(vis,-1,sizeof(vis));
        queue<Node> q;
        Node p;
        p.x=x,p.y=y,p.f=0;
        vis[x][y][p.f]=0;
        q.push(p);
        while(!q.empty())
        {
            p=q.front();q.pop();
            if(map[p.x][p.y]=='E'&&p.f) return vis[p.x][p.y][1];
            for(int i=0;i<4;i++)
            {
                int tx=p.x+d[i][0],ty=p.y+d[i][1];
                if(tx>=0&&tx<N&&ty>=0&&ty<M&&map[tx][ty]!='#')
                {
                    Node temp;
                    if(map[tx][ty]=='K') temp.f=1;
                    else temp.f=p.f;
                    if(vis[tx][ty][temp.f]!=-1) continue;
                    if(map[tx][ty]=='E'&&temp.f==0) continue;
                    temp.x=tx,temp.y=ty;
                    vis[tx][ty][temp.f]=vis[p.x][p.y][p.f]+1;
                    q.push(temp);
                }
            }
        }
        return -1;
    }
    
    int main()
    {
        int T;
        scanf("%d",&T);
        while(T--)
        {
            scanf("%d%d",&N,&M);
            for(int i=0;i<N;i++) scanf("%s",map[i]);
            int ans;
            for(int i=0;i<N;i++)
            for(int j=0;j<M;j++)
            if(map[i][j]=='P')
            {
                ans=bfs(i,j);break;
            }
            if(ans>0) printf("%d
    ",ans);
            else printf("No solution
    ");
        }
        
        return 0;
    }
    View Code







  • 相关阅读:
    HDU 4757 Tree 可持久化字典树 trie
    BZOJ 4198: [Noi2015]荷马史诗 哈夫曼树 k叉哈夫曼树
    BZOJ 3253 Fence Repair 哈夫曼树 水题
    BZOJ 3572: [Hnoi2014]世界树 虚树 树形dp
    2-SAT的一些题目
    二分图相关定理 最小点覆盖 最小路径覆盖 最大独立集 最小覆盖集
    POJ 1469 COURSES 二分图最大匹配 二分图
    快速排序
    排序算法:希尔排序
    霍夫曼编码实现
  • 原文地址:https://www.cnblogs.com/ACRykl/p/8834041.html
Copyright © 2011-2022 走看看