传送门

大意:

题目的意思还是模板的搜索,不同的是我们要记录路径了,而且是最短字典序最小的路径。

思路:

1、对于字典序最小,也就是说我们要尽量先往下走,然后是左…

这个很简单,因为在dfs中是顺序枚举,所以我们这样

b[5]={0,1,0,0,-1}//控制X坐标

c[5]={0,0,-1,1,0};//控制Y坐标

2、记录路径。开一个一维数组VV,向下走记为1,向左为2…。

3、每次到达终点时判断是否是当前的最短路径。是的话把路径转换为字符串存起来(覆盖掉原来存的),否则没用。

注意事项

1、使用vis标记走过的点时要把起点提前设置为1,我在这里浪费了好多时间。。。。。

2、在剪枝时不能dp[nx][ny]<=steps+1,不能有等号

	if(steps+1>dp[nx][ny])		return;

如果等于也return,可能前一次更新时并没有走到终点,这么剪枝就是错误的。

剪枝

对于30*50的矩阵,不剪枝还用什么dfs???

1、搜索过程中如果步数大于已走的最小步数,return。

2、起始也就是1的升级版。对于每个点,我们都存起先前到达的最短步数在dp数组中,如果当前步数加1大于了先前保留的值,则没有必要走下去,否则更新dp数组。

蟹蟹dalao观摩%%%%%%%!!!

代码

#include <bits/stdc++.h>
using namespace std;
int vis[50][100];
int a[50][100];
string ss;
int minn=9999999;
int b[5]={0,1,0,0,-1},c[5]={0,0,-1,1,0};
char s[10];
int vv[2000];
int dp[50][100];
void dfs(int x,int y,int steps)
{
if(steps>minn) return;
if(x==30&&y==50)
{
if(steps<minn)
{
minn=steps;
string temp;
for(int i=1;i<=steps-1;i++)
temp+=s[vv[i]];
ss=temp;
}
return;
}
for(int i=1;i<=4;i++)
{
int nx=x+b[i],ny=y+c[i];
if(nx<1||ny<1||nx>30||ny>50) continue;
if(a[nx][ny]==1||vis[nx][ny]) continue;
if(steps+1>dp[nx][ny]) return;
dp[nx][ny]=steps+1;
vv[steps]=i;
vis[nx][ny]=1;
dfs(nx,ny,steps+1);
vis[nx][ny]=0;
}
}
int main()
{
for(int i=0;i<=40;i++)
{
for(int j=1;j<=60;j++)
dp[i][j]=9999999;//初始化
}
for(int i=1;i<=30;i++)
{
for(int j=1;j<=50;j++)
{
a[i][j]=(getchar()-'0');
}
getchar();
}
s[1]='D',s[2]='L',s[3]='R',s[4]='U';
vis[1][1]=1;//记得起点标记
dfs(1,1,1);
cout<<ss;
// cout<<"DDDDRRURRRRRRDRRRRDDDLDDRDDDDDDDDDDDDRDDRRRURRUURRDDDDRDRRRRRRDRRURRDDDRRRRUURUUUUUUULULLUUUURRRRUULLLUUUULLUUULUURRURRURURRRDDRRRRRDDRRDDLLLDDRRDDRDDLDDDLLDDLLLDLDDDLDDRRRRRRRRRDDDDDDRR";
}

蓝桥杯2019初赛]迷宫(dfs版本)的更多相关文章

  1. [蓝桥杯2017初赛]迷宫 DFS

    题目描述 X星球的一处迷宫游乐场建在某个小山坡上.它是由10x10相互连通的小房间组成的. 房间的地板上写着一个很大的字母.我们假设玩家是面朝上坡的方向站立,则: L表示走到左边的房间,R表示走到右边 ...

  2. 第十届蓝桥杯2019年C/C++ 大学B组省赛试题

    2019年第十届蓝桥杯大赛软件类省赛C/C++大学B组 试题 A:组队 本题总分:5分 [问题描述] 作为篮球队教练,你需要从以下名单中选出 1号位至 5号位各一名球员, 组成球队的首发阵容. 每位球 ...

  3. 第十届蓝桥杯2019年C/C++ 大学A组省赛试题

    2019年蓝桥杯第十届软件类省赛 C/C++ 大 学 A 组 试题 A: 平方和 本题总分:5 分 [问题描述] 小明对数位中含有 2.0.1.9 的数字很感兴趣,在 1 到 40 中这样的数包括 1 ...

  4. 蓝桥杯---数独(模拟 || dfs)

    [编程题](满分33分) "数独"是当下炙手可热的智力游戏.一般认为它的起源是"拉丁方块",是大数 学家欧拉于1783年发明的. 如图[1.jpg]所示:6x6 ...

  5. 2019年第十届蓝桥杯省赛-迷宫(BFS/Excel大法)

    这题用dfs搜不出来,需要使用bfs并记录路径,设置好方向顺序跑就ok 正解类似:POJ-3984 迷宫问题 然而毕竟是暴力杯,我们的原则是代码能省就省(懒癌晚期 于是乎网上便出现了形形色色的题解,笔 ...

  6. [蓝桥杯2018初赛]小朋友崇拜圈(dfs找环)

    传送门 思路: 题意大意:n条有向边,找出最大环. 我们发现,如果一个小朋友没有被任何人崇拜,那么他一定不位于环中.为此我们可以设置一个indug数组预处理.如果2被崇拜了那么indug[2]就加加, ...

  7. 2019第十届蓝桥杯 E题 迷宫

    /*输入 30 50 01010101001011001001010110010110100100001000101010 00001000100000101010010000100000001001 ...

  8. 蓝桥杯 牌型种数 DFS

    牌型种数 小明被劫持到X赌城,被迫与其他3人玩牌. 一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张. 这时,小明脑子里突然冒出一个问题: 如果不考虑花色,只考虑点数,也不考虑自己得 ...

  9. 蓝桥杯 剪邮票 全排列+DFS

    剪邮票 如[图1.jpg], 有12张连在一起的12生肖的邮票. 现在你要从中剪下5张来,要求必须是连着的. (仅仅连接一个角不算相连) 比如,[图2.jpg],[图3.jpg]中,粉红色所示部分就是 ...

随机推荐

  1. 【Selenium06篇】python+selenium实现Web自动化:日志处理

    一.前言 最近问我自动化的人确实有点多,个人突发奇想:想从0开始讲解python+selenium实现Web自动化测试,请关注博客持续更新! 这是python+selenium实现Web自动化第六篇博 ...

  2. Go语言的GPM调度器是什么?

    我是平也,这有一个专注Gopher技术成长的开源项目「go home」 导读 相信很多人都听说过Go语言天然支持高并发,原因是内部有协程(goroutine)加持,可以在一个进程中启动成千上万个协程. ...

  3. ajax按楼层加载数据

    代码如下: <!doctype html> <html> <head> <meta charset="utf-8"> <tit ...

  4. EwoMail开源邮件服务器软件搭建

    EwoMail开源邮件服务器软件简介 EwoMail是基于Linux的开源邮件服务器软件,集成了众多优秀稳定的组件,是一个快速部署.简单高效.多语言.安全稳定的邮件解决方案,帮助你提升运维效率,降低 ...

  5. Matlab学习-(2)

    1. 文件读取 在编写一个matlab项目时候,通常要导入很多不同格式的数据,下面我们来学习不同的导入函数.(1) 保存工作区MATLAB支持工作区的保存.用户可以将工作区或工作区中的变量以文件的形式 ...

  6. Java环境下 selenium webDriver + chrome浏览器搭建与调试

    一.首先下载selenium webDriver jar包,下载地址如下: http://selenium-release.storage.googleapis.com/index.html 二.下载 ...

  7. HTML+CSS教程(三)marquee滚动效果

    一.marquee 1.marquee标签的属性scrollHeight:获取对象的滚动高度.scrollLeft:设置或获取位于对象左边界和窗口中目前可见内容的最左端之间的距离.scrollTop: ...

  8. java算法-二分法查找实现

    什么是二分法查找 首先,使用二分法查找的前提是:被查找的数组已排好序 具体实现: 假如有一组数为3,12,24,36,55,68,75,88要查给定的值24.可设三个变量front,mid,end分别 ...

  9. python 异步Web框架sanic

    我们继续学习Python异步编程,这里将介绍异步Web框架sanic,为什么不是tornado?从框架的易用性来说,Flask要远远比tornado简单,可惜flask不支持异步,而sanic就是类似 ...

  10. 对JavaScript中原型及原型链的理解

    什么是原型:  1,我们所创建的每一个函数,解析器都会向该函数对象添加一个属性prototype,这个属性指向一个对象,这个对象就是我们所谓的原型对象 2,如果我们将函数作为普通函数调用时,proto ...