纪念第一次用 “优先队列”, 第一次知道 “方向数组” ! BFS : 谁出队就找谁的邻接点访问之并入队!
#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <vector>
#include <stack>
#include <deque>
#include <queue>
#include <bitset>
#include <list>
#include <map>
#include <set>
#include <iterator>
#include <algorithm>
#include <functional>
#include <utility>
#include <sstream>
#include <climits>
#include <cassert>
#define BUG puts("here!!!");
using namespace std;
const int N = 305;
struct Point {
int x, y;
int steps;
};
char mmap[N][N];
int n, m;
int dx[] = {0, 0, -1, 1};
int dy[] = {-1, 1, 0, 0};
bool ok(int x, int y) {
return (x >= 0 && x < m && y >= 0 && y < n);
}
Point you, tag;
bool operator < (const Point &a, const Point &b) {
return a.steps > b.steps;
}
int bfs() {
priority_queue<Point> Q;
Q.push(you);
Point t, tmp;
int xx, yy;
while(!Q.empty()) {
t = Q.top(); Q.pop();
for(int i = 0; i < 4; i++) {
xx = t.x + dx[i];
yy = t.y + dy[i];
if(!ok(xx, yy) || mmap[xx][yy] == 'R' || mmap[xx][yy] == 'S') {
continue;
}
if(xx == tag.x && yy == tag.y) return t.steps + 1;
tmp.x = xx;
tmp.y = yy;
if(mmap[xx][yy] == 'B') {
tmp.steps = t.steps + 2;
}
else tmp.steps = t.steps + 1;
mmap[xx][yy] = 'R';
Q.push(tmp);
}
}
return -1;
}
int main() {
while(scanf("%d%d", &m, &n), m|n) {
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
cin >> mmap[i][j];
if(mmap[i][j] == 'Y') {
you.x = i;
you.y = j;
you.steps = 0;
}
else if(mmap[i][j] == 'T') {
tag.x = i, tag.y = j;
}
}
}
printf("%d\n", bfs());
}
return 0;
}