汤圆の拯救计划
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
只能用BFS
DFS会TLE
// bfs
#include <bits/stdc++.h>
using namespace std;
struct node
{
int x, y, step;
};
int n, m;
char gra[333][333];
int cat[333][333];
/*定义方向数组*/
int gotox[4] = {0, 0, 1, -1};
int gotoy[4] = {1, -1, 0, 0};
int bfs(int a, int b)
{
cat[a][b] = 1;
node p = {a, b, 0};
queue<node> q;
q.push(p);
while (!q.empty())
{
node temp = q.front();
q.pop();
if (gra[temp.x][temp.y] == 'O')
return temp.step;
for (int i = 0; i < 4; i++)
{
node d;
d.x = temp.x + gotox[i];
d.y = temp.y + gotoy[i];
d.step = temp.step + 1;
if (d.x >= 0 && d.y >= 0 && d.x < n && d.y < m && !cat[d.x][d.y] && gra[d.x][d.y] != '#')
{
cat[d.x][d.y] = 1;
q.push(d);
}
}
}
return -1;
}
int main()
{
ios::sync_with_stdio(false);
int t;
cin >> t;
while (t--)
{
memset(cat, 0, sizeof(cat));
cin >> n >> m;
int a, b;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
cin >> gra[i][j];
if (gra[i][j] == 'A')
{
a = i;
b = j;
}
}
}
cout << bfs(a, b) << endl;
}
return 0;
}