#include<cstdio>
int M, N, QueMax, *MX = new int, *MY = new int, dx[100], dy[100], NumberOfD;
bool flag[2001][2001];
char home;
void BFS() {
int *QueueX = new int[QueMax], *QueueY = new int[QueMax];
int *QueueAns = new int[QueMax];
int *head = new int, *tale = new int;
*head = 0;
*tale = 0;
*(QueueX + *tale) = *MX;
*(QueueAns + *tale) = 0;
*(QueueY + *tale) = *MY;
flag[*MX][*MY] = 1;
delete MX;
delete MY;
while (*head <= *tale) {
for (int i = -1; i <= 1; i++) {
for (int j = 0; j < NumberOfD; j++) {
if (dx[j] == *(QueueX + *head) + i && dy[j] == *(QueueY + *head)) {
printf("%d", *(QueueAns + *head) + 1);
return;
}
}
if (flag[*(QueueX + *head) + i][*(QueueY + *head)] == 0
&& *(QueueX + *head) + i >= 0
&& *(QueueX + *head) + i < N) {
flag[*(QueueX + *head) + i][*(QueueY + *head)] = 1;
*tale += 1;
*(QueueX + *tale) = *(QueueX + *head) + i;
*(QueueY + *tale) = *(QueueY + *head);
*(QueueAns + *tale) = *(QueueAns + *head) + 1;
}
}
for (int i = -1; i <= 1; i++) {
for (int j = 0; j < NumberOfD; j++) {
if (dx[j] == *(QueueX + *head) && dy[j] == *(QueueY + *head) + i) {
printf("%d", *(QueueAns + *head) + 1);
return;
}
}
if (flag[*(QueueX + *head)][*(QueueY + *head) + i] == 0
&& *(QueueY + *head) + i >= 0
&& *(QueueY + *head) + i < M) {
flag[*(QueueX + *head)][*(QueueY + *head) + i] = 1;
*tale += 1;
*(QueueX + *tale) = *(QueueX + *head);
*(QueueY + *tale) = *(QueueY + *head) + i;
*(QueueAns + *tale) = *(QueueAns + *head) + 1;
}
}
*head += 1;
}
printf("No Way!");
}
int main() {
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
scanf("%d%d", &N, &M);
QueMax = N * M;
getchar();
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
scanf("%c", &home);
if (home == 'm') {
*MX = i;
*MY = j;
}
if (home == '#') {
flag[i][j] = 1;
QueMax--;
}
if (home == 'd') {
dx[NumberOfD] = i;
dy[NumberOfD++] = j;
}
}
getchar();
}
BFS();
fclose(stdin);
fclose(stdout);
return 0;
}
20分,但和题解对拍了20来分钟了,仍然没断