描述

小Q被邪恶的大魔王困在了迷宫里,love8909决定去解救她。迷宫里面有一些陷阱,一旦走到陷阱里,就会被困身亡:(,迷宫里还有一些古老的传送阵,一旦走到传送阵上,会强制被传送到传送阵的另一头。

现在请你帮助love8909算一算,他至少需要走多少步才能解救到小Q? (上下左右四个方向走,传送门可以多次使用)

输入

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

输出

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

样例输入

2
5 5
....L
.###.
b#b#a
##.##
...Qa
5 5
....L
.###.
.#.#.
##.##
...Q.

样例输出

3
-1

题目来源

UESTC

cjx在做这题的时候真心难受(╯﹏╰),超时!后来发现每次标记后的点并不完全是经过的点,而是传送时候的点。泪奔!

修改后出现了WA,cjx有种苦尽甘来的感觉。事实是这样,很快就想到有一种特殊的情况没有考虑到。此案例通过后终于AC了。

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <queue>
#define MAXN 55
using namespace std; int T,M,N;
int csMap[27][5];
char m[MAXN][MAXN];
int flag[MAXN][MAXN];
int ans,bx,by,ex,ey;
int dir[4][2]={
{0,1},{0,-1},{1,0},{-1,0}
}; struct Node{
int x;
int y;
int step;
friend bool operator <(Node a, Node b){
return a.step>b.step;
}
}; //存储传送点
void save(char a, int x, int y){
int pos=a-'a';
if(csMap[pos][0]==0){
csMap[pos][1]=x;
csMap[pos][2]=y;
csMap[pos][0]=1;
}else if(csMap[pos][0]==1){
csMap[pos][3]=x;
csMap[pos][4]=y;
}
} int bfs(){
priority_queue<Node> Q;
Node n1;
n1.x=bx;
n1.y=by;
n1.step=0;
flag[bx][by]=1;
Q.push(n1);
while(!Q.empty()){
Node now=Q.top();
Q.pop();
if( now.x==ex && now.y == ey )return now.step;
for(int i=0; i<4; i++){
Node t;
t.x=now.x+dir[i][0];
t.y=now.y+dir[i][1];
t.step=now.step+1;
if( 1<=t.x&&t.x<=N && 1<=t.y&&t.y<=M &&!flag[t.x][t.y] && m[t.x][t.y]!='#'){
flag[t.x][t.y]=1;
if('a'<=m[t.x][t.y] && m[t.x][t.y]<='z'){
int pos=m[t.x][t.y]-'a';
if(csMap[pos][1]==t.x && csMap[pos][2]==t.y){
t.x=csMap[pos][3];
t.y=csMap[pos][4];
}else{
t.x=csMap[pos][1];
t.y=csMap[pos][2];
}
}
Q.push(t);
}
}
}
return -1;
} int main()
{
scanf("%d",&T);
while(T--){
scanf("%d %d",&N,&M);
for(int i=0; i<27; i++){
//0表示没有放任何的传送点
csMap[i][0]=0;
}
for(int i=1; i<=N; i++){
getchar();
for(int j=1; j<=M; j++){
scanf("%c",&m[i][j]);
if( 'a'<=m[i][j] && m[i][j]<='z' ){
save(m[i][j],i,j);
}
if( m[i][j]=='L'){
bx=i;
by=j;
}
if( m[i][j]=='Q'){
ex=i;
ey=j;
}
flag[i][j]=0;
}
}
ans=bfs();
printf("%d\n",ans);
}
return 0;
}

TOJ 2939 解救小Q的更多相关文章

  1. CDOJ_149 解救小Q

    原题网址:http://acm.uestc.edu.cn/#/problem/show/149 小Q被邪恶的大魔王困在了迷宫里,love8909决定去解救她. 迷宫里面有一些陷阱,一旦走到陷阱里,就会 ...

  2. UESTC149 解救小Q

    小Q被邪恶的大魔王困在了迷宫里,love8909决定去解救她.迷宫里面有一些陷阱,一旦走到陷阱里,就会被困身亡:(,迷宫里还有一些古老的传送阵,一旦走到传送阵上,会强制被传送到传送阵的另一头.现在请你 ...

  3. bzoj3007 解救小云公主

    3007: 解救小云公主 Time Limit: 5 Sec  Memory Limit: 512 MB Submit: 159  Solved: 71 [id=3007" style=&q ...

  4. 平面直接坐标系线段相交问题(小Q(钟神)的问题)

    [问题描述] 小 Q 对计算几何有着浓厚的兴趣.他经常对着平面直角坐标系发呆,思考一些有趣的问题.今天,他想到了一个十分有意思的题目:首先,小 Q 会在?轴正半轴和?轴正半轴分别挑选?个点.随后,他将 ...

  5. 剑指Offer——网易笔试之解救小易

    知识要点 首先介绍一下曼哈顿,曼哈顿是一个极为繁华的街区,高楼林立,街道纵横,从A地点到达B地点没有直线路径,必须绕道,而且至少要经C地点,走AC和 CB才能到达,由于街道很规则,ACB就像一个直角3 ...

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

    小Q系列故事——世界上最遥远的距离 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)T ...

  7. HD4505小Q系列故事——电梯里的爱情

    Problem Description 细心的同事发现,小Q最近喜欢乘电梯上上下下,究其原因,也许只有小Q自己知道:在电梯里经常可以遇到他心中的女神HR. 电梯其实是个很暧昧的地方,只有在电梯里,小Q ...

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

    小Q系列故事——电梯里的爱情 Time Limit: 300/100 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Tota ...

  9. HDU-4515 小Q系列故事——世界上最遥远的距离

    小Q系列故事——世界上最遥远的距离 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) ...

随机推荐

  1. JavaScript对象(持续更新中)

    1Array对象 2.Boolean对象 3.Date对象 4.Math对象 5.Number对象 6.String对象 ※String.replace():替换字符串 实例: str.replace ...

  2. angular formBuilder

  3. owinAuthorize

    Nuget包获取 Install-Package Microsoft.AspNet.WebApi.Owin -Version 5.1.2 Install-Package Microsoft.Owin. ...

  4. C# 高斯消元项目运用

    C# 高斯消元项目运用 最近项目涉及到一个需求,需要把指定数量的多个商品,混合装入到多个不同型号的箱子中(每种型号的箱子装入商品的种类和个数是固定的).这就涉及到解多元一次方程 针对多元一次方程一般用 ...

  5. EFCore扩展Select方法(根据实体定制查询语句)

    EFCore扩展Select方法(根据实体定制查询语句)  通常用操作数据库的时候查询返回的字段是跟 我们的定义的实体是不一致的,所以往往针对UI或者接口层创建大量的Model, 而且需要手动对应字段 ...

  6. js Array操作

    JS中数组的操作 1.数组的创建 var arrayObj = new Array(); //创建一个数组 var arrayObj = new Array([size]); //创建一个数组并指定长 ...

  7. 「BZOJ 3218」 a + b Problem

    题目链接 戳我 \(Solution\) 题目为什么是\(a\ +\ b\ Problem\)啊?这和题面半毛钱关系都没有. 现在来讲一下这题的解法吧,我们首先看看没有奇怪的方格这一个条件吧. 其实没 ...

  8. Kotlin 函数和函数表达式

    学习了kotlin 的控制. 其中最为强大的是各种控制可以直接作为表达式来使用. 那么在kotlin中,函数也是可以作为表达式来使用. 而且kotlin中函数的创建方式有很多方式. 第一种: 传统创建 ...

  9. java 中 ==

    @Test public void fuu2(){ String a = new String("aw"); String b = new String("aw" ...

  10. Mysql高性能优化规范建议

    数据库命令规范 所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用mysql保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来) 数据库对象的命名要能做到见名识意 ...