算法入门经典6.4.2走迷宫

本题主要是为了记录一下代码,这里题目就直接截图,节省时间了。


下面是实现代码:

#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);
}


猜你喜欢

转载自blog.csdn.net/haoge9551/article/details/50696508