Time Limit: 1000 ms Memory Limit: 65536 KiB
Problem Description
又到了汤圆星球一年一度的汤圆节了,但是大魔王却过来把汤圆公主抓走了Σ( ° △ °|||)︴
身为汤圆骑士的QAQ蒟蒻自然而然的肩负着拯救汤圆的使命
QAQ蒟蒻经历了千辛万苦(并没有)之后,来到了大魔王的城堡,根据情报,汤圆公主就被大魔王放在城堡内,然后QAQ蒟蒻发现自己是一个路
痴,所幸的是他拿到了大魔王的城堡的地图,而且在这上面标注了自己和汤圆公主的位置,那么问题来了,聪明的你能帮他计算出需要多少单位
的时间来赶到汤圆公主的位置吗?
Ps:QAQ蒟蒻每一次都可以移动到相邻的非墙的格子中,每次移动都要花费1个单位的时间
有公共边的格子定义为相邻
Input
一开始为一个整数T代表一共有T组数据
每组测试数据的第一行有两个整数n,m (2<=n,m<=300)
接下来的n行m列为大魔王的迷宫,其中
’#’为墙壁,‘_‘为地面
A代表QAQ蒟蒻,O代表汤圆公主:
Output
一组数据输出一个整数代表从QAQ蒟蒻到汤圆的位置的最短时间
如果QAQ蒟蒻不能到达汤圆的位置,输出-1
Sample Input
2
3 3
__A
_##
__O
2 2
A#
#O
Sample Output
6
-1
Hint
Source
QAsQ
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct
{
int x, y, step;
} que[90002];
int map[305][305], in, out, begini, beginj, endi, endj;
int next[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};
int n, m;
void f()
{
while(out<=in)
{
int r, tx, ty;
for(r=0; r<4; r++)
{
tx = que[out].x + next[r][0];
ty = que[out].y + next[r][1];
if(map[tx][ty] == 1)
{
map[tx][ty] = 0;
que[++in].x = tx;
que[in].y = ty;
que[in].step = que[out].step + 1;
if(que[in].x==endi&&que[in].y==endj)
{
return;
}
}
}
out++;
}
}
int main()
{
int t, i, j;
char ch;
scanf("%d", &t);
while(t--)
{
scanf("%d %d", &n, &m);
for(i=1; i<=n; i++)
{
getchar();
for(j=1; j<=m; j++)
{
scanf("%c", &ch);
if(ch=='#')
{
map[i][j] = 0;
}
else if(ch=='_')
{
map[i][j] = 1;
}
else if(ch=='A')
{
map[i][j] = 1;
begini = i;
beginj = j;
}
else
{
map[i][j] = 1;
endi = i;
endj = j;
}
}
}
for(i=0; i<=n+1; i++)
{
map[i][0] = 0;
map[i][m+1] = 0;
}
for(i=0; i<=m+1; i++)
{
map[0][i] = 0;
map[n+1][i] = 0;
}
in = 0;
out = 1;
que[++in].x = begini;
que[in].y = beginj;
que[in].step = 0;
map[begini][beginj] = 0;
f();
if(in >= out) printf("%d\n", que[in].step);
else printf("-1\n");
}
return 0;
}