本题主要是为了记录一下代码,这里题目就直接截图,节省时间了。
下面是实现代码:
#include <stdio.h>
#include <string.h>
#define MAXN 10
int maze[MAXN][MAXN],vis[MAXN][MAXN];
int fa[MAXN][MAXN],dist[MAXN][MAXN],last_dir[MAXN][MAXN];
int q[MAXN * MAXN];
int dx[]={-1,1,0,0};
int dy[]={0,0,-1,1};
int n,m;
char name[]={'U','D','L','R'};
void bfs(int x,int y)
{
int d,u,front = 0,rear = 0;
u = x*m +y;
vis[x][y]=1;fa[x][y] = u;dist[x][y]=1;
q[rear++] = u;
while(front < rear)
{
u = q[front ++];
x = u/m;
y = u%m;
for ( d = 0;d < 4;d++)
{
int nx = x+ dx[d];
int ny = y+ dy[d];
if(nx >=0 && nx <n && ny >=0 && ny < m && maze[nx][ny] && !vis[nx][ny])
{
int v = nx * m +ny;
vis[nx][ny] = 1;
fa[nx][ny] = u;
dist[nx][ny] = dist[x][y] + 1;
q[rear++] = v;
last_dir[nx][ny] = d;
}
}
}
}
void print_path(int x,int y)
{
int fx = fa[x][y]/m;
int fy = fa[x][y]%m;
if(fx != x || fy != y)
{
print_path(fx,fy);
putchar(name[last_dir[x][y]]);
}
}
int main()
{
freopen("input.txt","r",stdin);
scanf("%d%d",&n,&m);
char s[20];
int i,j;
for(i = 0 ;i < n;i++)
{
scanf("%s",s);
for(j = 0;j < m;j++)
maze[i][j] = s[j] - '0';
}
for( i= 0;i < n;i++)
{
for(j = 0;j< m;j++)
{
printf("%d ",maze[i][j]);
}
printf("\n");
}
memset(vis,0,sizeof(vis));
bfs(0,0);
printf("%d\n",dist[n-1][m-1]);
print_path(n-1,m-1);
}