题意:
没有什么坑点,直接搜索即可,水题,
#include <bits/stdc++.h>
using namespace std;
#define cpp_io() {ios::sync_with_stdio(false); cin.tie(NULL);}
#define rep(i,a,n) for (int i=a;i<n;i++)
#define repp(i,a,n) for (int i=a;i<=n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define CLR(a,b) memset(a,(b),sizeof(a))
#define all(x) (x).begin(),(x).end()
#define SZ(x) ((int)(x).size())
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define ls o<<1
#define rs o<<1|1
typedef long long ll;
typedef vector<int> VI;
const int MAXN = (int)2e2+10;
const int INF = 0x3f3f3f3f;
const int mod = (int)1e9+7;
void F() {
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
}
int n,m;
int sx,sy;
char mps[MAXN][MAXN];
int dx[]={0,0,1,-1};
int dy[]={-1,1,0,0};
bool vis[MAXN][MAXN][10];
struct node {
int x,y;
int k;
int b;
node(int _x=0,int _y=0,int _k=0,int _b=0):x(_x),y(_y),k(_k),b(_b){}
bool operator<(const node &r)const {
if(r.k==k) return r.b>b;
return r.k<k;
}
};
bool check(int x,int y){
return x>=0&&x<n&&y>=0&&y<m;
}
void bfs() {
priority_queue<node> que;
vis[sx][sy][0]=true;
que.push(node(sx,sy,0,0));
while(!que.empty()) {
node tmp=que.top();
que.pop();
if(mps[tmp.x][tmp.y]=='T') {
cout<<tmp.k<<endl;
return ;
}
rep(i,0,4){
int xx=tmp.x+dx[i];
int yy=tmp.y+dy[i];
if(check(xx,yy)&&!vis[xx][yy][tmp.b]) {
vis[xx][yy][tmp.b]=true;
if(mps[xx][yy]=='T') {
cout<<tmp.k+1<<endl;
return ;
}
else if(mps[xx][yy]=='#') {
if(tmp.b>0) {
que.push(node(xx,yy,tmp.k+2,tmp.b-1));
}
}
else if(mps[xx][yy]=='B') {
if(tmp.b<5) {
rep(j,0,5) {
if(tmp.b+1+j<=5) {
que.push(node(xx,yy,tmp.k+1+j*2,tmp.b+1+j));
}
}
}
else
que.push(node(xx,yy,tmp.k+1,tmp.b));
}
else if(mps[xx][yy]=='P')
que.push(node(xx,yy,tmp.k,tmp.b));
else
que.push(node(xx,yy,tmp.k+1,tmp.b));
}
}
}
cout<<-1<<endl;
}
int main(int argc, char const *argv[])
{
F();
cpp_io();
while(cin>>n>>m){
if(n==0||m==0) break;
CLR(vis,false); CLR(mps,0);
rep(i,0,n) cin>>mps[i];
rep(i,0,n)
rep(j,0,m)
if(mps[i][j]=='S')
sx=i, sy=j;
bfs();
}
return 0;
}