bfs 迷宫打印所有路径 java,bfs 较为全面的迷宫路径问题,包括路径的打印,起点到任一点的最小步数. | 学步园...

/*提供的输入数据:

输入行数列数 起点终点

然后输入任意点的位置,可求起点到终点的距离, 0 0 表示结束.

input:

6 5 0 0 0 4

1 1 0 1 1

1 0 1 1 1

1 0 1 0 0

1 0 1 1 1

1 1 1 0 1

1 1 1 1 1

0 4

1 3

4 0

4 4

0 0

output:

DDDDRRUUURUR

12

10

4

10

#include

#include

#include

using namespace std;

const int mm=301;

int map[mm][mm];

int vis[mm][mm];

int dist[mm][mm];

int fa[mm][mm];

int last_dir[mm][mm];

//int dx[4]= {0,0,1,-1};

//int dy[4]= {1,-1,0,0};

//char name[]="";

int dx[] = {-1,1,0,0};

int dy[] = {0,0,-1,1};

char name[] = "UDLR";//???

int c[mm*mm];

int q[mm*mm];

int n,m,x,y;

void bfs(int x,int y)

{

int u=x*m+y;

vis[x][y]=1;

dist[x][y]=0;//起点距离初始化为0

fa[x][y]=u;//起点的祖先就是本身,用于起点寻找的标志

int front=0,rear=0;

q[rear++]=u;//入队

while(front

{

u=q[front++];//出队,节点拓展

x=u/m;

y=u%m;

for(int i=0; i<4; i++)//状态的转移

{

int nx=x+dx[i];

int ny=y+dy[i];

if(nx>=0&&nx=0&&ny

{

int v=nx*m+ny;

q[rear++]=v;//符合条件入队

dist[nx][ny]=dist[x][y]+1;//距离更新

fa[nx][ny]=u;//记录祖先

vis[nx][ny]=1;

last_dir[nx][ny]=i;//记录路径

}

}

}

}

void print(int x,int y)

{

int i=0;

for(;;)

{

int fx=fa[x][y]/m;

int fy=fa[x][y]%m;

if(fx==x&&fy==y)//满则该条件的点为起点

break;

c[i++]=last_dir[x][y];//有于是从终点开始寻找,将路径记录后反向输出

x=fx;

y=fy;

}

while(i--)

putchar(name[c[i]]);

//for(int j=0;j

//printf("%d ",c[j]);

}

int main()

{

int x1,y1,x2,y2;

int p,q;

while(scanf("%d%d%d%d%d%d",&n,&m,&x1,&y1,&x2,&y2)==6)

{

for(int i=0; i

for(int j=0; j

scanf("%d",&map[i][j]);

bfs(x1,y1);

//打印路径

print(x2,y2);

//可求起点到任意点的最短距离

bool ret=false;

while(scanf("%d%d",&p,&q)==2)

{

if(p==0&&q==0)

{

ret=true;

break;

}

printf("%d\n",dist[p][q]);

}

if(ret) break;

}

return 0;

}

你可能感兴趣的:(bfs 迷宫打印所有路径 java,bfs 较为全面的迷宫路径问题,包括路径的打印,起点到任一点的最小步数. | 学步园...)