hdu acm 1728题逃离迷宫如何用DFS解决

这题的思路是求出最少的转弯数目,然后和最大的转弯数目比一比,就可以得出答案了,像这种求最少的一般用BFS比较好做的,DFS是解决一些判断定性的问题的。这题用DFS不好做。BFS可以轻松解决。

#include<iostream>

#include<queue>

#include<cstdio>

usingnamespace std;

char map[102][102];

int visit[102][102];

int bx,by,ex,ey,step,N,M;

int XX[4][2]={{1,0},{-1,0},{0,1},{0,-1}};

struct node{int x,y,step,dir;};

void bfs()

{

queue<node>qu;

node t;

int k;

t.x=bx, t.y=by, t.step=0, t.dir=-1;

visit[bx][by]=0;

qu.push(t) ;

while(!qu.empty())

{

t=qu.front();

qu.pop();

for(k=0;k<4;k++)

{

node tt=t;

tt.x+=XX[k][0], tt.y+=XX[k][1];

if(tt.x<1||tt.x>M||tt.y<1||tt.y>N||map[tt.x][tt.y]=='*')

continue;

if(tt.dir!=k&&tt.dir!=-1)tt.step++;

if(tt.step>step)continue;//!!!

if(tt.x==ex&&tt.y==ey)

{

cout<<"yes\n";return;

}

if(visit[tt.x][tt.y]>=tt.step)

{ tt.dir=k;

visit[tt.x][tt.y]=tt.step;

qu.push(tt);

}

}

}

cout<<"no\n";

return ;

}

int main()

{

int CASE,i,j;

cin>>CASE;

while(CASE--)

{

cin>>M>>N;//M行 N列

for(i=1;i<=M;i++)

for(j=1;j<=N;j++)

{

cin>>map[i][j];

visit[i][j]=999;

}

cin>>step>>by>>bx>>ey>>ex;//x对应列

if(bx==ex&&by==ey)

{cout<<"yes\n"; continue;}

bfs();

}

return0;

}