#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
#define MAXN 100
using namespace std;
int q[MAXN*MAXN];
int maze[MAXN][MAXN],fa[MAXN][MAXN],vis[MAXN][MAXN],dist[MAXN][MAXN]; //墙是1空白是0
int n, m;
int dir[4][2]={{0,-1}, {-1,0}, {0,1}, {1,0}};
int last_dir[MAXN][MAXN];
void bfs(int x, int y)
{
int front=0, rear=0, d, u;
u = x*m+y;
vis[x][y] = 1; fa[x][y] = u; dist[x][y]=0;
q[rear++] = u;
while(front<rear)
{
u=q[front++];
x = u/m; y = u%m;
for(d=0; d<4; d++)
{
int nx = x+dir[d][0], ny = y+dir[d][1];
if(nx>=0&&nx<n && ny>=0&&ny<m &&!maze[nx][ny]&&!vis[nx][ny])
{
int v = nx*m+ny;
q[rear++] = v;
vis[nx][ny] = 1;
fa[nx][ny] = u;
dist[nx][ny] = dist[x][y]+1;
last_dir[nx][ny]=d;
}
}
}
}
int step[MAXN];
char name[4]={'L','U','R','D'};
void printf_path(int x, int y)
{
int c = 0;
for(;;)
{
int fx = fa[x][y]/m;
int fy = fa[x][y]%m;
if(fx==x&&fy==y)break;
step[c++]=last_dir[x][y];
x=fx;
y=fy;
}
while(c--)
cout<<name[step[c]]<<' ';
}
int main()
{
int i, j;
while(cin>>n>>m)
{
memset(vis, 0, sizeof(vis));
memset(dist, -1, sizeof(dist));
memset(q, 0, sizeof(q));
for(i=0; i<n; i++)
for(j=0; j<m; j++)
cin>>maze[i][j];
bfs(0,0);
for(i=0; i<n; i++)
{
for(j=0; j<m; j++)
cout<<dist[i][j]<<' ';
cout<<endl;
}
printf_path(1,4);
}
system("pause");
return 0;
}
求迷宫的的算法
最新推荐文章于 2025-08-10 21:28:09 发布