原题地址:点击打开链接
深搜超时,用广度搜索,由于碰到‘B’时需要先将墙销毁,该步的实现方法,可以先将该点加入队列,出队时判断,如果是墙(‘B’)就先变成空(‘E’)在加入队列即可。
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
struct Point
{
int x;
int y;
}tar,my;
char map[310][310];
int used[310][310];
int x[4]={-1,0,1,0},y[4]={0,1,0,-1},min,n,m;
int bfs(Point my)
{
int t=0,res=0,a,b,i;
queue<Point>que[2];
que[t].push(my);
while(1)
{
while(!que[t].empty())
{
Point p=que[t].front();
que[t].pop();
if(map[p.x][p.y]=='B')
{
map[p.x][p.y]='E';
que[1-t].push(p);
continue;
}
else if(map[p.x][p.y]=='T')
return res;
for(i=0;i<4;i++)
{
a=p.x+x[i];
b=p.y+y[i];
if(a>=0&&a<n&&b>=0&&b<m&&used[a][b]!=1&&map[a][b]!='R'&&map[a][b]!='S')
{
used[a][b]=1;
Point pt={a,b};
que[1-t].push(pt);
}
}
}
res++;
if(que[1-t].empty())
return -1;
t=1-t;
}
}
int main()
{
int i,j;
while(scanf("%d%d",&n,&m)&&n&&m)
{
memset(used,0,sizeof(used));
getchar();
for(i=0;i<n;i++)
gets(map[i]);
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
if(map[i][j]=='Y')
{
my.x=i;
my.y=j;
}
else if(map[i][j]=='T')
{
tar.x=i;
tar.y=j;
}
}
int res=bfs(my);
printf("%d\n",res);
}
return 0;
}