此题咋看是广搜,因为要输出最短路,实际上要用深搜,因为有状态的改变,碰到墙就可以消去墙,而bfs不能像dfs那样回溯消去标记
#include
int n,m,cnt;
int maze[100][100];
int bx[]={1,-1,0,0};
int by[]={0,0,1,-1};
void dfs(int x,int y,int step)
{
if(step>cnt)
return;
for(int i=0;i<4;i++)
{
int xx=x+bx[i];
int yy=y+by[i];
if(xx<=0||xx>m||yy<=0||yy>n||maze[xx][yy]==1)
continue;
while(xx>0&&xx<=m&&yy>0&&yy<=n&&maze[xx][yy]!=1){
if(maze[xx][yy]==3){
if(cnt>step+1)
cnt=step+1;
break;
}
xx+=bx[i];
yy+=by[i];
}
if(maze[xx][yy]==3)
continue;
if(xx>0&&xx<=m&&yy>0&&yy<=n){
maze[xx][yy]=0;
dfs(xx-bx[i],yy-by[i],step+1);
maze[xx][yy]=1;
}
}
}
int main()
{
while(scanf("%d%d",&n,&m)!=-1&&n||m)
{
cnt=11;
int i,j,x1,y1;
for(i=1;i<=m;i++)
for(j=1;j<=n;j++){
scanf("%d",&maze[i][j]);
if(maze[i][j]==2){
x1=i;
y1=j;
}
}
dfs(x1,y1,0);
if(cnt<11)
printf("%d\n",cnt);
else
printf("%d\n",-1);
}
return 0;
}