Description
小Q被邪恶的大魔王困在了迷宫里,love8909决定去解救她。
迷宫里面有一些陷阱,一旦走到陷阱里,就会被困身亡:(,迷宫
里还有一些古老的传送阵,一旦走到传送阵上,会强制被传送到
传送阵的另一头。
现在请你帮助love8909算一算,他至少需要走多少步才能解
救到小Q?
Input
第一行为一个整数$T$,表示测试数据组数。
每组测试数据第一行为两个整数$N$,$M$,($1\leq N, M\leq 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
代码如下:
<pre name="code" class="cpp">#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int MAXN = 55;
char mp[MAXN][MAXN];
int vis[MAXN][MAXN];
// n 为行数,m 为列数
// sx, sy 为起始位置,ex, ey为最终位置
// zimu_x, zimu_y 只是单纯为了查找,因为函数无法传出两个参数,所以定为全局变量。
int n, m, sx, sy, ex, ey, zimu_x, zimu_y;
int dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
struct node
{
int x;
int y;
int step;
};
//查找字母下标
void chazhao(char a, int x, int y)
{
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
if(mp[i][j]==a && (i!=x || j!=y))
{
zimu_x = i;
zimu_y = j;
}
}
int bfs()
{
node s;
queue<node> q;
s.x = sx;
s.y = sy;
s.step = 0;
vis[sx][sy]=1;
q.push(s);
while(!q.empty())
{
node tmp = q.front();
q.pop();
if(tmp.x==ex && tmp.y==ey)
return tmp.step;
for(int i=0; i<4; i++)
{
int nx = tmp.x + dir[i][0];
int ny = tmp.y + dir[i][1];
if(nx>=0 && nx<n && ny>=0 && ny<m && !vis[nx][ny] && mp[nx][ny]!='#')
{
vis[nx][ny] = 1;
if(mp[nx][ny]>='a' && mp[nx][ny]<='z')
{
chazhao(mp[nx][ny], nx, ny);
nx = zimu_x;
ny = zimu_y;
}
node t;
t.x = nx;
t.y = ny;
t.step = tmp.step+1;
q.push(t);
}
}
}
return -1;
}
int main()
{
int T;
cin >> T;
while(T--)
{
memset(vis, 0, sizeof(vis));
cin >> n >> m;
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
cin >> mp[i][j];
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
{
if(mp[i][j]=='L')
{
sx=i;
sy=j;
}
if(mp[i][j]=='Q')
{
ex=i;
ey=j;
}
}
}
cout << bfs() << endl;
}
return 0;
}