#include <iostream>
#include <stack>
#include <string.h>
using namespace std;
struct Point {
int x;
int y;
Point(int x_, int y_) :x(x_), y(y_) {}
};
int map[202][202];
int pace[202][202];
int f(int p,int R,int C,int Es,int Ec) {
int flag = 0;
for (int x = 1; x <= R; x++) {
for (int y = 1; y <= C; y++) {
if (pace[x][y] == p) {
if (x==Es&&y==Ec)
return 1;
if (map[x][y + 1] == 0 && pace[x][y + 1] == -1)
pace[x][y + 1] = p + 1, flag = 1;
if (map[x][y - 1] == 0 && pace[x][y - 1] == -1)
pace[x][y - 1] = p + 1, flag=1;
if (map[x + 1][y] == 0 && pace[x + 1][y] == -1)
pace[x + 1][y] = p + 1,flag=1;
if (map[x - 1][y] == 0 && pace[x - 1][y] == -1)
pace[x - 1][y] = p + 1,flag=1;
}
}
}
if (flag == 0)
return 2;
return 0;
}
int main() {
int T;
cin >> T;
while (T--) {
int R, C;
cin >> R >> C;
int Rs, Cs,Es,Ec;
for (int x = 1; x <= R; x++) {
for (int y = 1; y <= C; y++) {
char c;
cin >> c;
if (c == '.')
map[x][y] = 0;
else if (c == '#')
map[x][y] = 1;
else if (c == 'S')
Rs = x, Cs = y;
else if (c == 'E') {
map[x][y] = 0;
Es = x, Ec = y;
}
}
}
for (int i = 0; i <= R + 1; i++) {
map[i][0] = 1, map[i][C + 1] = 1;
}
for (int j = 0; j <= C + 1; j++) {
map[0][j] = 1, map[R + 1][j] = 1;
}
memset(pace, -1, sizeof(pace));
pace[Rs][Cs] = 0;
int p = 0;
while (true) {
int t = f(p,R,C,Es,Ec);
if (t == 1) {
cout << p << endl;
break;
}
else if (t == 2) {
cout << "oop!" << endl;
break;
}
p++;
}
}
return 0;
}
[Coursera]算法基础_Week9_考试_Q6
最新推荐文章于 2019-02-02 21:23:52 发布