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;
}
时间: 2024-11-09 01:10:34

UESTC149 解救小Q的相关文章

UESTC 149 解救小Q

简单 有意思的迷宫问题 主要看平时标记的习惯吧.. 一开始就跪了,多亏迪哥给了组数据.. 5 5....L.###aa#...##.##...Q. answer 9 1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<string> 6 #include<queue> 7 #include<algor

牛客网-解救小易(网易)

题目描述 有一片1000*1000的草地,小易初始站在(1,1)(最左上角的位置).小易在每一秒会横向或者纵向移动到相邻的草地上吃草(小易不会走出边界).大反派超超想去捕捉可爱的小易,他手里有n个陷阱.第i个陷阱被安置在横坐标为xi ,纵坐标为yi 的位置上,小易一旦走入一个陷阱,将会被超超捕捉.你为了去解救小易,需要知道小易最少多少秒可能会走入一个陷阱,从而提前解救小易. 输入描述: 第一行为一个整数n(n ≤ 1000),表示超超一共拥有n个陷阱. 第二行有n个整数x i ,表示第i个陷阱的

重庆OI2017 小 Q 的棋盘

小 Q 的棋盘 时间限制: 1 Sec  内存限制: 512 MB 题目描述 小Q正在设计一种棋类游戏.在小Q设计的游戏中,棋子可以放在棋盘上的格点中.某些格点之间有连线,棋子只能在有连线的格点之间移动.整个棋盘上共有V个格点,编号为0,1,2…,V-1,它们是连通的,也就是说棋子从任意格点出发,总能到达所有的格点.小Q在设计棋盘时,还保证棋子从一个格点移动到另外任一格点的路径是唯一的.小Q现在想知道,当棋子从格点0出发,移动N步最多能经过多少格点.格点可以重复经过多次,但不重复计数. 输入 第

HDU 4520 小Q系列故事——最佳裁判

Time Limit : 500/200ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other) Problem Description 过去的2012年对小Q来说是很悲催的一年,失恋了12次,每次都要郁闷1个来月. 好在小Q是个体育迷,在最痛苦的时候,他常常用观看各种体育节目来麻醉自己,比如伦敦奥运会期间,小Q就常常在周末邀上一群单身同事聚在自己的蜗居,一边畅饮啤酒,一边吹牛. 小Q最喜欢看的是跳水,主要原因也是因为这个项目有中国人参

【bzoj4972】小Q的方格纸 前缀和

题目描述 方格纸与草稿纸一样,都是算法竞赛中不可或缺的重要工具.身经百战的小Q自然也会随身带着方格纸.小Q的方格纸有n行m列,一共n*m个方格,从上到下依次标记为第1,2,...,n行,从左到右依次标记为第1,2,...,m列,方便起见,小Q称第i行第j列的方格为(i,j).小Q在方格纸中填满了数字,每个格子中都恰好有一个整数a_{i,j}.小Q不喜欢手算,因此每当他不想计算时,他就会让你帮忙计算.小Q一共会给出q个询问,每次给定一个方格(x,y)和一个整数k(1<=k<=min(x,y)),

二分图 [ZJOI2007] 小Q的矩阵游戏

[问题描述] 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏--矩阵游戏.矩阵游戏在一个N*N黑白方阵进行(如同国际象棋一般,只是颜色是随意的).每次可以对该矩阵进行两种操作: l 行交换操作:选择矩阵的任意两行,交换这两行(即交换对应格子的颜色) l 列交换操作:选择矩阵的任意两列,交换这两列(即交换对应格子的颜色) 游戏的目标,即通过若干次操作,使得方阵的主对角线(左上角到右下角的连线)上的格子均为黑色. 对于某些关卡,小Q百思不得其解,以致他开始怀疑这些关卡是不是根本

hdu4505小Q系列故事——电梯里的爱情

小Q系列故事——电梯里的爱情 Time Limit: 300/100 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 3626    Accepted Submission(s): 2284 Problem Description 细心的同事发现,小Q最近喜欢乘电梯上上下下,究其原因,也许只有小Q自己知道:在电梯里经常可以遇到他心中的女神HR. 电梯其实是个很暧昧的地方,只有在电梯

hdu4505 小Q系列故事——电梯里的爱情(水题)

Problem Description http://acm.hdu.edu.cn/showproblem.php?pid=4505 细心的同事发现,小Q最近喜欢乘电梯上上下下,究其原因,也许只有小Q自己知道:在电梯里经常可以遇到他心中的女神HR. 电梯其实是个很暧昧的地方,只有在电梯里,小Q才有勇气如此近距离接近女神,虽然觉得有点不自在,但次数多了,女神也习惯了小Q的存在,甚至熟悉到仿佛不说上句话自己也都觉得不合适了.可是,他们的谈话也仅仅限于今天天气不错啊或是你吃了吗之类的,往往在对方微笑点

hdu---(4515)小Q系列故事——世界上最遥远的距离(模拟题)

小Q系列故事——世界上最遥远的距离 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 1751    Accepted Submission(s): 628 Problem Description 世界上最遥远的距离 不是生与死 而是我就站在你面前 你却不知道我爱你 世界上最遥远的距离 不是我就站在你面前你却不知道我爱你 而是明明知道彼此相爱