题目大意:这个题是以坦克大战为原型出来的题目,就是走迷宫的变种,给定一个地图mxn的地图,地图上有普通的砖B,金砖S,河R,空地E,和一个宝物位置T,和你的位置Y,求吃到宝物的最小步数(坦克通过普通砖B需要两步,空地E一步,不能通过金砖和河)..
#include <queue>
#include <iostream>
using namespace std;
int n,m;
int mintime[305][305];
char map[305][305];
struct point
{
int x,y,time;
}s,e;
int h[4][2]={1,0,-1,0,0,-1,0,1};
queue<point> q;
int bfs(point s)
{
int i,j,x,y; point t,tt;
while(!q.empty()) q.pop();
q.push(s); mintime[s.x][s.y]=0;
while(!q.empty())
{
t=q.front(); q.pop();
for(i=0;i<4;i++)
{
x=t.x+h[i][0]; y=t.y+h[i][1];
if(x>=0&&x<n&&y>=0&&y<m&&map[x][y]!='R'&&map[x][y]!='S')
{
tt.x=x; tt.y=y; tt.time=t.time+1;
if(map[x][y]=='B') tt.time++;
if(tt.time<mintime[x][y])
{
q.push(tt); mintime[x][y]=tt.time;
}
}
}
}
return mintime[e.x][e.y];
}
int main(int argc, char *argv[])
{
int i,j;
while(cin>>n>>m&&(n+m))
{
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
cin>>map[i][j]; mintime[i][j]=100000005;
if(map[i][j]=='Y') { s.x=i; s.y=j; s.time=0;}
if(map[i][j]=='T') { e.x=i; e.y=j;}
}
int ans=bfs(s);
if(ans<100000005) cout<<ans<<endl;
else cout<<-1<<endl;
}
return 0;
}