zoukankan      html  css  js  c++  java
  • UESTC149 解救小Q

    小Q被邪恶的大魔王困在了迷宫里,love8909决定去解救她。
    迷宫里面有一些陷阱,一旦走到陷阱里,就会被困身亡:(,迷宫
    里还有一些古老的传送阵,一旦走到传送阵上,会强制被传送到
    传送阵的另一头。
    现在请你帮助love8909算一算,他至少需要走多少步才能解
    救到小Q?

     

    Input

    第一行为一个整数T,表示测试数据组数。
    每组测试数据第一行为两个整数N,M,(1 <= N, M <= 50)表示
    迷宫的长和宽。
    接下来有N行,每行M个字符,是迷宫的具体描述。
    '.'表示安全的位置,'#'表示陷阱,
    'Q'表示小Q的位置,'L'表示love8909所在位置,
    数据保证love8909只有一个,数据也保证小Q只有一个。
    小写字母'a'-'z'表示分别表示不同的传送阵,数据保证传送阵
    两两配对。

     

    Output

    每组数据输出一行,解救小Q所需的最少步数,如果无论如何都
    无法救小Q,输出-1。

     

    Sample Input

    2

    5 5
    ....L
    .###.
    b#b#a
    ##.##
    ...Qa

    5 5
    ....L
    .###.
    .#.#.
    ##.##
    ...Q.

    Sample Output

    3
    -1

    注意  从当前‘a'传送到另一个’a‘的时候  只标记第一个’a'。

    /* ***********************************************
    Author        :guanjun
    Created Time  :2016/7/15 16:11:53
    File Name     :1.cpp
    ************************************************ */
    #include <iostream>
    #include <cstring>
    #include <cstdlib>
    #include <stdio.h>
    #include <algorithm>
    #include <vector>
    #include <queue>
    #include <set>
    #include <map>
    #include <string>
    #include <math.h>
    #include <stdlib.h>
    #include <iomanip>
    #include <list>
    #include <deque>
    #include <stack>
    #define ull unsigned long long
    #define ll long long
    #define mod 90001
    #define INF 0x3f3f3f3f
    #define maxn 10010
    #define cle(a) memset(a,0,sizeof(a))
    const ull inf = 1LL << 61;
    const double eps=1e-5;
    using namespace std;
    priority_queue<int,vector<int>,greater<int> >pq;
    struct Node{
        int x,y;
    };
    struct cmp{
        bool operator()(Node a,Node b){
            if(a.x==b.x) return a.y> b.y;
            return a.x>b.x;
        }
    };
    struct node{
        int x,y;
        int dis;
    };
    bool cmp(int a,int b){
        return a>b;
    }
    int n,m;
    char mp[60][60];
    int sx,sy,ex,ey;
    int vis[60][60];
    int dir[4][2]={1,0,0,1,0,-1,-1,0};
    map<pair<int,int>,pair<int,int> >mpp;
    int bfs(){
        cle(vis);
        node u={sx,sy,0};
        vis[sx][sy]=1;
    
        queue<node>q;
        q.push(u);
        while(!q.empty()){
            u=q.front(),q.pop();
            if(u.x==ex&&u.y==ey)return u.dis;
            node v;
            for(int i=0;i<4;i++){
                int nx=u.x+dir[i][0];
                int ny=u.y+dir[i][1];
                //cout<<v.x<<" "<<v.y<<endl;
                if(!vis[nx][ny]&&mp[nx][ny]!='#'&&nx<=n&&nx>=1&&ny<=m&&ny>=1){
                    char c=mp[nx][ny];
    
                    if(c<='z'&&c>='a'){
                        v.x=mpp[{nx,ny}].first;
                        v.y=mpp[{nx,ny}].second;
                        v.dis=u.dis+1;
                        q.push(v);
                    }
                    else{
                        v.x=nx;v.y=ny;
                        v.dis=u.dis+1;
                        q.push(v);
                    }
                    vis[nx][ny]=1;
                }
            }
        }
        return -1;
    }
    vector<pair<int,int> >v[60];
    int main()
    {
        #ifndef ONLINE_JUDGE
        freopen("in.txt","r",stdin);
        #endif
        //freopen("out.txt","w",stdout);
        int t;
        char c;
        cin>>t;
        while(t--){
            mpp.clear();
            for(int i=0;i<=55;i++)v[i].clear();
    
            cin>>n>>m;
            for(int i=1;i<=n;i++){
                for(int j=1;j<=m;j++){
                    cin>>c;
                    if(c=='L')sx=i,sy=j;
                    if(c=='Q')ex=i,ey=j;
                    if(c<='z'&&c>='a'){
                        v[int(c-'a')].push_back({i,j});
                    }
                    mp[i][j]=c;
                }
            }
            for(int i=0;i<26;i++){
                if(v[i].size()==2){
                    mpp[{v[i][0].first,v[i][0].second}]={v[i][1].first,v[i][1].second};
                    mpp[{v[i][1].first,v[i][1].second}]={v[i][0].first,v[i][0].second};
                }
            }
            cout<<bfs()<<endl;
        }
        return 0;
    }
  • 相关阅读:
    php服务器安装memcache
    [PHP脚本]安装及使用
    [PHP]针对外服务器mail函数的php.ini配置
    [COBOL]安装配置及大型机模拟Hercules配置
    [Sqlite3].help中的命令介绍
    [NavigatLite4Mysql]DB管理工具使用
    [MS-SQLserver2005]Windows64位安装问题
    [MS-SQL]20130806_LocalDB_DOS命令使用
    [MS-SQL]20130806_LocalDB安装
    [MS]Microsoft SQL Server 2008 R2 开发版/企业版/标准版
  • 原文地址:https://www.cnblogs.com/pk28/p/5674273.html
Copyright © 2011-2022 走看看