列表

详情


NC205060. 牛牛走迷宫

描述

牛牛周末去了游乐园走迷宫。这是一个n*m大小的01迷宫,0表示这个位置可以走,1表示有障碍物不能。
走。现在牛牛在起点(1,1),他想要走到终点(n,m)。并且,如果他能够走到终点的话,他想要知道自己是怎么走到终点的。
如果可以走到终点,因为牛牛比较懒他会先保证走的步数最少,又因为牛牛是个追求完美的人,如果有多
条路径步数一样,他会选择走字典序最小的那条。
数据保证起点和终点都是0

输入描述

第一行输入两个数n和m,表示n*m的迷宫大小。(2≤n、m≤500)
接下来n行,每行m个字符,字符为0或者1,0表示可以走,1表示不能走。

输出描述

如果牛牛不能走到终点,请输出"-1",如果可以走到终点,第一行请输出牛牛的最小步数k。
接下来一行,输出一个长度为k的字符串(仅包含'D'、'L'、'R'、'U')表示牛牛的路径。
(D表示向下,L表示向左,R表示向右,U表示向上)

示例1

输入:

2 2
01
00

输出:

2
DR

说明:

先向下走,再向右走

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 3ms, 内存消耗: 960K, 提交时间: 2020-09-10 23:04:58

#include<bits/stdc++.h>
using namespace std;
char mp[505][505],hs[4]={'D','L','R','U'};
int n,m,x[4]={1,0,0,-1},y[4]={0,-1,1,0},tot=-1;
bool f[505][505];
struct node{
	int x,y,id,last;
	char f;
}ar[300000];
void print(node now){
	vector<char> v;
	while(now.id){
		v.push_back(now.f);
		now=ar[now.last];
	}
	reverse(v.begin(),v.end());
	printf("%d\n",v.size());
	for(char c: v)putchar(c);
}
void bfs(){
	queue<node> q;
	q.push(ar[++tot]={1,1,0,-1,'E'});f[1][1]=1;
	while(q.size()){
		node now=q.front();q.pop();
		for(int i=0;i<4;++i){
			int nr=now.x+x[i],nc=now.y+y[i];
			if(nr&&nc&&nr<=n&&nc<=m&&mp[nr][nc]=='0'&&!f[nr][nc]){
				ar[++tot]={nr,nc,tot,now.id,hs[i]};
				if(nr==n&&nc==m){print(ar[tot]);return;} 
				q.push(ar[tot]),f[nr][nc]=1;
			}
		}
	}
	puts("-1");
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;++i)scanf("%s",mp[i]+1);
	bfs();
	return 0;
}

C++(g++ 7.5.0) 解法, 执行用时: 7ms, 内存消耗: 1676K, 提交时间: 2023-03-20 16:21:53

 #include<bits/stdc++.h>
using namespace std;
const int N=550;
string s[N];
int n,m,st[N][N];
int dx[4]={1,0,0,-1};
int dy[4]={0,-1,1,0};
string a="DLRU";
struct node
{
	string s;
	int x,y,step;
};
void bfs()
{
	queue<node>q; q.push({"",0,0,0});
	st[0][0]=1;
	while(q.size())
	{
		auto temp=q.front(); q.pop();
		int x=temp.x,y=temp.y,d=temp.step;
		string ss=temp.s;
		if(x==n-1&&y==m-1)
		{
			cout<<d<<endl;
			cout<<ss;
			return ;
		}
		for(int i=0;i<4;i++)
		{
			int tempx=x+dx[i],tempy=y+dy[i];
			if(tempx<0||tempx>=n||tempy<0||tempy>=m) continue;
			if(s[tempx][tempy]=='1') continue;
			if(st[tempx][tempy]) continue;
			st[tempx][tempy]=1;
			q.push({ss+a[i],tempx,tempy,d+1});
		}
	}
}
int main(void)
{
	cin>>n>>m;
	for(int i=0;i<n;i++) cin>>s[i];
	bfs();
    if(!st[n-1][m-1]) cout<<-1;
	return 0;
}

C++ 解法, 执行用时: 35ms, 内存消耗: 50424K, 提交时间: 2021-05-27 18:56:44

#include<stdio.h>
#include<string>
#include<iostream>
using namespace std;
char s[505][505];
int dx[4]={0,-1,1,0};
int dy[4]={1,0,0,-1};
char s2[5]={"DLRU"};
struct duqi{
	int x,y,k;
	string s1;
};
duqi q[1000005];
int b[505][505]={0};
int main()
{
	int i,j,k,l,n,m,x1,y1;
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++)
	scanf("%s",s[i]+1);
	q[0].x=1;q[0].y=1;q[0].k=0;b[1][1]=1;
	for(i=0,j=0;i<=j;i++){
		if(q[i].x==m&&q[i].y==n){
			cout<<q[i].k<<endl<<q[i].s1;return 0;
		}
		for(l=0;l<4;l++)
		{
			x1=dx[l]+q[i].x;
			y1=dy[l]+q[i].y;
			if(b[y1][x1]==0&&y1>=1&&y1<=n&&x1>=1&&x1<=m&&s[y1][x1]=='0'){
				b[y1][x1]=1;
				q[++j].y=y1;q[j].x=x1;q[j].s1=q[i].s1+s2[l];q[j].k=q[i].k+1;
			}
		}
	}
	printf("-1");
}

上一题