小Q被邪恶的大魔王困在了迷宫里,love8909决定去解救她。
迷宫里面有一些陷阱,一旦走到陷阱里,就会被困身亡:(,迷宫
里还有一些古老的传送阵,一旦走到传送阵上,会强制被传送到
传送阵的另一头。
现在请你帮助love8909算一算,他至少需要走多少步才能解
救到小Q?
第一行为一个整数 T T,表示测试数据组数。
每组测试数据第一行为两个整数
N
N,
M
M,(
1≤N,M≤50
1≤N,M≤50)表示
迷宫的长和宽。
接下来有 N N行,每行 M 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
思路:注意那句话:一旦到达传送阵,会被强制传送;
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<queue>
#include<stack>
#include<iostream>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#define INF 0x3f3f3f3f
#define e exp(1.0)
#define pi acos(-1.0)
#define max_n 110
using namespace std;
char mapp[max_n][max_n];
int visit[max_n][max_n];
int n,m;
struct node
{
int x;
int y;
int step;
bool friend operator <(node a,node b)
{
return a.step>b.step;
}
};
void bfs(int x1,int y1,int x2,int y2)
{
bool flag=false;
priority_queue<node> q;
node now,next;
int move[4][2]={0,1,0,-1,1,0,-1,0};
now.x=x1;
now.y=y1;
now.step=0;
q.push(now);
while(!q.empty())
{
next=q.top();
q.pop();
if(next.x==x2 && next.y==y2)
{
flag=true;
break;
}
for(int i=0;i<4;i++)
{
now.x=next.x+move[i][0];
now.y=next.y+move[i][1];
if(mapp[now.x][now.y]!='#' && !visit[now.x][now.y] && now.x>=1 && now.x<=n && now.y>=1 && now.y<=m)
{
visit[now.x][now.y]=1;
now.step=next.step+1;
if(mapp[now.x][now.y]<='z' && mapp[now.x][now.y]>='a')
{
bool ans=true;
for(int j=1;j<=n;j++)
{
for(int p=1;p<=m;p++)
{
if(mapp[j][p]==mapp[now.x][now.y] && (j!=now.x || p!=now.y))//注意||符号,不是&&
{
now.x=j;
now.y=p;
ans=false;
break;
}
}
if(!ans) break;
}
}
q.push(now);
}
}
}
if(flag) printf("%d\n",next.step);
else printf("-1\n");
}
int main()
{
int t,x1,x2,y1,y2;
scanf("%d",&t);
while(t--)
{
memset(visit,0,sizeof(visit));
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++)
{
getchar();
for(int j=1;j<=m;j++)
{
scanf("%c",&mapp[i][j]);
if(mapp[i][j]=='L')
{
x1=i;
y1=j;
}
else if(mapp[i][j]=='Q')
{
x2=i;
y2=j;
}
}
}
bfs(x1,y1,x2,y2);
}
return 0;
}