题目描述
有一天NoSoul跟他女朋友去一个游乐场玩,在一个迷宫里,悲了个催的,他们俩走丢了„„ 现在给出迷宫的具体信息,请你判断一下他们俩能否在给定的时间内找到对方。
输入
输入包含多组测试用例。第一行是一个整数N,接下来有N组数据;
每组的第一行是3个整数X、Y、T(0<X、Y<10,T>=0);
接下来是一个X行,Y列的字符矩阵。矩阵中的字符含义如下:
A:代表NoSoul初始时所在的位置
B:代表NoSoul女朋友初始时所在的位置
#:代表该位置是墙壁,无法通过
*:代表该位置是陷阱,若不慎误入,将被困再也无法走出 数字
n:代表进入该位置,需要等待n个时间才能走出(0<=n<=9)
NoSoul跟他女朋友每次均只能从其当前位置往上下左右相邻的不是墙壁的位置走去,且不能走出迷宫,每走一次需要花费1个时间。
NoSoul跟他女朋友初始时所在的位置均不需要等待即可立即走出。
输出
对应每组测试数据,若他们俩能在T个时间内(包含T)找到对方,则输出他们能够找到对方的最短时间,否则输出字符串“A miss B”。每组输出占一行。
样例输入
2
3 4 4
#10#
A12B
*#01
3 4 2
#10#
A12B
*#01
样例输出
3
<span style="font-size:18px;">#include <cstdio>
#include <queue>
#include <climits> using namespace std;
int X, Y;
int AX, AY, BX, BY;
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, -1, 0, 1}; char map[10][10]; int mintime[10][10]; bool flag[10][10];
struct Node { int x, y; int t; };
struct cmp {
bool operator()(const Node &a, const Node &b) {
return a.t > b.t;
}
};
int BFS(int x, int y) {
int tx, ty, i, j;
Node t1, t2;
priority_queue<Node, vector<Node>, cmp> PQ;
for(i=0; i<X; i++) {
for(j=0; j<Y; j++) {
mintime[i][j] = INT_MAX;
flag[i][j] = false;
}
}
mintime[x][y] = 0;
flag[x][y] = true;
t1.x = x;
t1.y = y;
t1.t = 0;
PQ.push(t1);
while(!PQ.empty()) {
t2 = PQ.top();
PQ.pop();
for(i=0; i<4; i++) {
tx = t2.x + dx[i];
ty = t2.y + dy[i];
if(tx>=0 && tx<X && ty>=0 && ty<Y && map[tx][ty]!='*' && map[tx][ty]!='#' && !flag[tx][ty]) {
mintime[tx][ty] = t2.t + 1;
flag[tx][ty] = true;
if(!(map[tx][ty]=='A' || map[tx][ty]=='B'))
t1.t = t2.t + map[tx][ty] - '0' + 1;
else
t1.t = t2.t + 1;
t1.x = tx;
t1.y = ty;
PQ.push(t1);
}
}
}
return mintime[AX][AY] > mintime[BX][BY] ? mintime[AX][AY] : mintime[BX][BY];
}
int main() {
int N, T, i, j;
scanf("%d", &N);
while(N--) {
int ans = INT_MAX;
scanf("%d %d %d\n", &X, &Y, &T);
for(i=0; i<X; i++) {
for(j=0; j<Y; j++) {
scanf("%c", &map[i][j]);
if(map[i][j]=='A') {
AX = i; AY = j;
}
if(map[i][j]=='B') {
BX = i; BY = j;
}
}
getchar();
}
for(i=0; i<X; i++) {
for(j=0; j<Y; j++) {
if(map[i][j]!='#') {
int t = BFS(i, j);
if(t<ans)
ans = t;
}
}
}
if(ans<=T)
printf("%d\n", ans);
else
puts("A miss B"); }
return 0;
} </span>