第三个BFS
题目大意:这个题是以坦克大战为原型出来的题目,就是走迷宫的变种,给定一个地图mxn的地图,地图上有普通的砖B,金砖S,河R,和一个宝物位置T,和你的位置Y,求吃到宝物的最小步数(坦克通过普通砖需要两步,不能通过金砖和河)...
Sample Input
3 4 YBEB EERE SSTE 0 0
Sample Output
8
思路:走迷宫的思路,加点变化,在将横纵坐标步数入队的同时在将stay入队,如果当前走的点是普通砖,stay就等于1,否则等于0,当这个点出队的时候如果stay=1就另stay=0,再入队一次。。实现了原地停留一步的效果。。。
if(map[i][j]=='T') return step;
if(stay)
{
push(i); push(j); push(stay-1); push(step+1);
continue;
}
for(fang=0;fang<4;fang++)
if(i+mov[fang].x>-1&&i+mov[fang].x<m&&j+mov[fang].y>-1&&j+mov[fang].y<n&&lock[i+mov[fang].x][j+mov[fang].y]==0&&map[i+mov[fang].x][j+mov[fang].y]!='R'&&map[i+mov[fang].x][j+mov[fang].y]!='S')
{
lock[i+mov[fang].x][j+mov[fang].y]=1;
push(i+mov[fang].x); push(j+mov[fang].y);
if(map[i+mov[fang].x][j+mov[fang].y]=='B')
push(1);
if(map[i+mov[fang].x][j+mov[fang].y]=='E'||map[i+mov[fang].x][j+mov[fang].y]=='T')
push(0);
push(step+1);
}
}
return 0;
}
int main()
{
int i,j,o;
while(cin>>m>>n&&m)
{
head=rear=0;
memset(lock,0,sizeof(lock));
for(i=0;i<m;i++)
cin>>map[i];
for(i=0;i<m;i++)
for(j=0;j<n;j++)
if(map[i][j]=='Y')
goto start;
start:
lock[i][j]=1; push(i); push(j); push(0); push(0);
o=bfs();
if(o)
cout<<o<<endl;
else
cout<<"-1"<<endl;
}
return 0;
}