题目描述
又到了汤圆星球一年一度的汤圆节了,但是大魔王却过来把汤圆公主抓走了Σ( ° △ °|||)︴
身为汤圆骑士的QAQ蒟蒻自然而然的肩负着拯救汤圆的使命
QAQ蒟蒻经历了千辛万苦(并没有)之后,来到了大魔王的城堡,根据情报,汤圆公主就被大魔王放在城堡内,然后QAQ蒟蒻发现自己是一个路
痴,所幸的是他拿到了大魔王的城堡的地图,而且在这上面标注了自己和汤圆公主的位置,那么问题来了,聪明的你能帮他计算出需要多少单位
的时间来赶到汤圆公主的位置吗?
Ps:QAQ蒟蒻每一次都可以移动到相邻的非墙的格子中,每次移动都要花费1个单位的时间
有公共边的格子定义为相邻
输入
一开始为一个整数T代表一共有T组数据
每组测试数据的第一行有两个整数n,m (2<=n,m<=300)
接下来的n行m列为大魔王的迷宫,其中
’#’为墙壁,‘_‘为地面
A代表QAQ蒟蒻,O代表汤圆公主:
输出
一组数据输出一个整数代表从QAQ蒟蒻到汤圆的位置的最短时间
如果QAQ蒟蒻不能到达汤圆的位置,输出-1
输入样例
2
3 3
__A
_##
__O
2 2
A#
#O
输出样例
6
-1
think
判断QAQ的位置是不是在第一个,然后上下左右遍历不是墙的地方知道找到公主的位置输出出来(千万不要忘记数组清零哦)
#include<bits/stdc++.h>
using namespace std;
int n, m;
int xx[4] = {-1, 1, 0, 0};
int yy[4] = {0, 0, 1, -1};
char a[330][330];
int vir[330][330];
struct node
{
int x1, y1, num;
}g, z;
void bfs(int x, int y)
{
vir[x][y] = 1;
queue<node> Q;
g.x1 = x;
g.y1 = y;
g.num = 0;
Q.push(g);
while(!Q.empty())
{
g = Q.front();
Q.pop();
if(a[g.x1][g.y1]=='O')
{
printf("%d\n", g.num);
return ;
}
for(int i = 0;i<4;i++)
{
int zx, zy;
zx = g.x1 + xx[i];
zy = g.y1 + yy[i];
if(zx>=0&&zx<n&&zy>=0&&zy<m)
if(a[zx][zy]!='#'&&vir[zx][zy]==0)
{
z.x1 = zx;
z.y1 = zy;
z.num = g.num + 1;
Q.push(z);
vir[zx][zy] = 1;
}
}
}
printf("-1\n");
}
int main()
{
int t, j, i;
scanf("%d", &t);
while(t--)
{
memset(a, 0, sizeof(a));
memset(vir, 0, sizeof(vir));
scanf("%d %d", &n, &m);
for(i = 0;i<n;i++)
{
scanf("%s", a[i]);
}
int flag = 0;
for(i = 0;i<n;i++)
{
for(j = 0;j<m;j++)
{
if(a[i][j]=='A')
{
flag = 1;
break;
}
}
if(j!=m) break;
}
bfs(i, j);
}
return 0;
}
/***************************************************
User name: jk180140刘洋
Result: Accepted
Take time: 4ms
Take Memory: 692KB
Submit time: 2019-01-17 14:24:55
****************************************************/```