迷宫——第十届蓝桥杯

题目地址:http://tzcoder.cn/acmhome/problemdetail.do?method=showdetail&id=7342

视频讲解地址:【迷宫(第十届蓝桥杯)——杂题选讲(BFS)】https://www.bilibili.com/video/BV1sY411B7c4?vd_source=2c6f0c5d33eca0d75d8c3ceb6375eb3e

题目描述:

tips:在第十届蓝桥杯中本题以填空题的形式出现

描述

下图给出了一个迷宫的平面图,其中标记为1 的为障碍,标记为0 的为可

以通行的地方。

010000

000100

001001

110000

迷宫的入口为左上角,出口为右下角,在迷宫中,只能从一个位置走到这

个它的上、下、左、右四个方向之一。

对于上面的迷宫,从入口开始,可以按DRRURRDDDR 的顺序通过迷宫,

一共10 步。其中D、U、L、R 分别表示向下、向上、向左、向右走。

输入

第一行为n和m(2<=n, m<=100),表示迷宫的行数和列数。

接下来有n行,每行由m个0或1组成。

输出

在步数最少的前提下,请找出字典序最小的一个作为答案(数据保证一定有答案)。

请注意在字典序中D<L<R<U。

样例输入

4 6

010000

000100

001001

110000

样例输出

DRRURRDDDR

源代码

//作者:Baicheng Qu
//BFS+字符串
//TZOJ 7342
#include<bits/stdc++.h>
using namespace std;
#define maxn 50
char maze[maxn][maxn];
char d[4]={'D','L','R','U'};//注意,这里要按照字典序顺序排
int dir[4][2]={{1,0},{0,-1},{0,1},{-1,0}};//这里的顺序要和上面d数组一一对应
int n,m;
struct node
{
    int x;
    int y;
    string s;
    /* data */
};
void bfs()
{
    node now,next;
    queue<node> que;
    maze[0][0]='1';
    now.s="";
    now.x=now.y=0;
    que.push(now);
    while(!que.empty())
    {
        now=que.front();
        que.pop();
        if(now.x==n-1&&now.y==m-1)
        {
            cout<<now.s<<endl;

        }
        for(int i=0;i<4;i++)
        {
            next.x=now.x+dir[i][0];
            next.y=now.y+dir[i][1];
        if(next.x>=0&&next.x<n&&next.y>=0&&next.y<m&&maze[next.x][next.y]=='0')
        {
            maze[next.x][next.y]='1';
            next.s=now.s+d[i];
            que.push(next);
        }
        }
    } 
}

int main()
{
    cin>>n>>m;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            cin>>maze[i][j];
        }
    }
    bfs();
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

captainfly_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值