Cómo usar DFS para resolver el problema de escapar del laberinto en hdu acm 1728
La idea de esta pregunta es encontrar el número mínimo de vueltas y luego compararlo con el número máximo de vueltas para obtener la respuesta. Para este tipo de número mínimo, generalmente es. BFS es más fácil de usar y resuelve algunos problemas de juicio cualitativo. Esta pregunta es difícil de resolver usando DFS. BFS se puede resolver fácilmente.
#include
#include
#include
usando el espacio de nombres std;
mapa de caracteres[102][102];
int visita[102][102];
int bx,by,ex,ey,step,N,M;
int XX[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
estructura nodo{int x,y,step,dir;};
void bfs()
{
cola
nodo t;
int k;
t.x=bx, t.y=by, t.step=0, t.dir=-1;
visitar[bx][by]=0;
qu.push(t) ;
mientras(!qu.empty())
{
t=qu.front();
qu.pop();
for(k=0;k<4;k++)
{
nodo tt=t;
tt.x+=XX[k][0], tt.y+=XX[k][1]; p>
if(tt.x<1||tt.x>M||tt.y<1||tt.y>N||map[tt.x][tt.y]=='* ')
continuar;
if(tt.dir!=k&&tt.dir!=-1)tt.step++;
if(tt.step> paso)continuar;//!!!
if(tt.x==ex&&tt.y==ey)
{
cout<<"sí \n";return;
}
if(visita[tt.x][tt.y]>=tt.step)
{ tt. dir=k;
visita[tt.x][tt.y]=tt.step;
qu.push(tt);
}
}
}
cout<<"no\n";
return ;
} p>
int main()
{
int CASE,i,j;
cin>>CASE;
while(CASE--)
{
cin>>M>>N;//M filas N columnas
for(i=1;i< =M;i++)
for(j=1;j<=N;j++)
{
cin>>ma
p[i][j];
visitar[i][j]=999;
}
cin>>paso>>por>>bx >>ey>>ex;//x columna correspondiente
if(bx==ex&&by==ey)
{cout<<"yes\n"; /p>
bfs();
}
return0;
}