蓝桥杯2019初赛]迷宫(dfs版本)
大意:
题目的意思还是模板的搜索,不同的是我们要记录路径了,而且是最短字典序最小的路径。
思路:
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版本)的更多相关文章
- [蓝桥杯2017初赛]迷宫 DFS
题目描述 X星球的一处迷宫游乐场建在某个小山坡上.它是由10x10相互连通的小房间组成的. 房间的地板上写着一个很大的字母.我们假设玩家是面朝上坡的方向站立,则: L表示走到左边的房间,R表示走到右边 ...
- 第十届蓝桥杯2019年C/C++ 大学B组省赛试题
2019年第十届蓝桥杯大赛软件类省赛C/C++大学B组 试题 A:组队 本题总分:5分 [问题描述] 作为篮球队教练,你需要从以下名单中选出 1号位至 5号位各一名球员, 组成球队的首发阵容. 每位球 ...
- 第十届蓝桥杯2019年C/C++ 大学A组省赛试题
2019年蓝桥杯第十届软件类省赛 C/C++ 大 学 A 组 试题 A: 平方和 本题总分:5 分 [问题描述] 小明对数位中含有 2.0.1.9 的数字很感兴趣,在 1 到 40 中这样的数包括 1 ...
- 蓝桥杯---数独(模拟 || dfs)
[编程题](满分33分) "数独"是当下炙手可热的智力游戏.一般认为它的起源是"拉丁方块",是大数 学家欧拉于1783年发明的. 如图[1.jpg]所示:6x6 ...
- 2019年第十届蓝桥杯省赛-迷宫(BFS/Excel大法)
这题用dfs搜不出来,需要使用bfs并记录路径,设置好方向顺序跑就ok 正解类似:POJ-3984 迷宫问题 然而毕竟是暴力杯,我们的原则是代码能省就省(懒癌晚期 于是乎网上便出现了形形色色的题解,笔 ...
- [蓝桥杯2018初赛]小朋友崇拜圈(dfs找环)
传送门 思路: 题意大意:n条有向边,找出最大环. 我们发现,如果一个小朋友没有被任何人崇拜,那么他一定不位于环中.为此我们可以设置一个indug数组预处理.如果2被崇拜了那么indug[2]就加加, ...
- 2019第十届蓝桥杯 E题 迷宫
/*输入 30 50 01010101001011001001010110010110100100001000101010 00001000100000101010010000100000001001 ...
- 蓝桥杯 牌型种数 DFS
牌型种数 小明被劫持到X赌城,被迫与其他3人玩牌. 一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张. 这时,小明脑子里突然冒出一个问题: 如果不考虑花色,只考虑点数,也不考虑自己得 ...
- 蓝桥杯 剪邮票 全排列+DFS
剪邮票 如[图1.jpg], 有12张连在一起的12生肖的邮票. 现在你要从中剪下5张来,要求必须是连着的. (仅仅连接一个角不算相连) 比如,[图2.jpg],[图3.jpg]中,粉红色所示部分就是 ...
随机推荐
- 一、uart&tty驱动
一.I.MX6 UART驱动 文件路径:\linux_IMX6_CoreC_3..35_for_Linux\drivers\tty\serial\imx.c .驱动入口函数:imx_serial_in ...
- 如何从零开始学Python?会玩游戏就行,在玩的过程就能掌握编程
现在学习编程的人很多,尤其是python编程,都列入高考了,而且因为人工智能时代的到来,编程也将是一门越来越重要的技能. 但是怎么从零开始学python比较好呢?其实,你会玩游戏就行. 从零基础开始教 ...
- python画图——雪花(科赫曲线)
科赫曲线是一种分形,其形态非常像雪花,因此又被称作科赫雪花.雪花曲线. 下面是用python的turtle包让我们来实时画一个 import turtledef koch(t,n): #定义一个函数 ...
- .NET Core 发布时去掉多余的语言包文件夹
用 .NET Core 3.x 作为目标框架时发布完之后,会发现多了很多语言包文件夹,类似于: 有时候,不想要生成这些语言包文件夹,需要稍微配置一下. 在 PropertyGroup 节点中添加如下的 ...
- js的localStorage基础认识
新建a.html文件: <!DOCTYPE html> <html> <body> <div id="result"></di ...
- [Java网络安全系列面试题] GET 和 POST 的区别在哪里?
一. 概述 本文的内容源自其他博客的总结,属于笔者的读书笔记,结构如下: HTTP 的请求报文 GET 方法的特点 POST 方法的特点 GET 和 POST 的区别 二. HTTP 的请求报文 首先 ...
- MyBatis model、xml、mapper 自动生成,附源码
Mybatis 代码自动生成 model.xml.mapper 代码结构图 代码地址 https://github.com/shootercheng/codegen 需要修改的地方见 readme
- 一图解析MongoDB
了解MongoDB,这一张图就够了: 版权所有,转载请注明出处.
- linux--配置开发环境 --Nginx篇
安装: 安装好了话,我们的nginx的目录在: /etc/nginx 启动: sudo service nginx start 然后访问我们的页面就可以看到了我们的界面 然后我们配置我们的域名: 我 ...
- foreach里的按引用传值问题
1.foreach($arr as $k=>&$v){ } 这样循环时候最后一个结果前边会有&,出现输出不了的情况,这时候只需要加一个unset($v),加在循环里和外均可. 2 ...