2019蓝桥杯大学B组E题(BFS+路径记忆)

版权声明:本文为博主原创文章,欢迎转载。如有问题,欢迎指正。 https://blog.csdn.net/weixin_42172261/article/details/89647625

题目描述
下图给出了一个迷宫的平面图,其中标记为 1 的为障碍,标记为 0 的为可 以通行的地方。
010000
000100
001001
110000
迷宫的入口为左上角,出口为右下角,在迷宫中,只能从一个位置走到这 个它的上、下、左、右四个方向之一。 对于上面的迷宫,从入口开始,可以按DRRURRDDDR 的顺序通过迷宫, 一共 10 步。其中 D、U、L、R 分别表示向下、向上、向左、向右走。 对于下面这个更复杂的迷宫(30 行 50 列),请找出一种通过迷宫的方式, 其使用的步数最少,在步数最少的前提下,请找出字典序最小的一个作为答案。 请注意在字典序中D<L<R<U。
测试样例
4 6
010000
000100
001001
110000

DRRURRDDDR

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;

int nextt[4][2]={{1,0},{0,-1},{0,1},{-1,0}};//字典序广搜 
char path[4]={'D','L','R','U'}; 
int maze[100][100];
int book[100][100];
struct node{
	int x, y, step, pre;
	char ch;	//代表它来的方式,一号点没有来的方式 
}q[10000];

void getpath(int t)//回溯输出
{
	if(t==1)//一号点没有来的方式
		return;
	getpath(q[t].pre);
	printf("%c", q[t].ch);
}

int main()
{
	int n, m;
	scanf("%d%d", &n, &m);
	for(int i=0; i<n; i++)
		for(int j=0; j<m; j++)
			scanf("%1d", &maze[i][j]);

	int head=1, tail=1;
	q[tail].x=0;
	q[tail].y=0;
	q[tail].step=0;
	q[tail].pre=-1;
	tail++;
	book[0][0]=1;
	
	int flag=0;
	while(head<tail){
		for(int k=0; k<4; k++){
			int tx=q[head].x+nextt[k][0];
			int ty=q[head].y+nextt[k][1];
			if(tx<0||tx>=n||ty<0||ty>=m||book[tx][ty]||maze[tx][ty]==1)
				continue;
			book[tx][ty]=1;
			q[tail].x=tx;
			q[tail].y=ty;
			q[tail].pre=head;
			q[tail].step=q[head].step+1;
			q[tail].ch=path[k];
			tail++;
			if(tx==n-1&&ty==m-1){
				flag=1;
				break;
			}
		}
		if(flag==1) 
			break;
		head++;
	}
	getpath(tail-1);
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/weixin_42172261/article/details/89647625