[每日习题]年终奖(动态规划) 迷宫问题(DFS+回溯)——牛客习题

news2024/11/22 15:06:52

        hello,大家好,这里是bang___bang_,本篇记录2道牛客习题,年终奖(简单),迷宫问题(中等),如有需要,希望能有所帮助!

  

目录

1️⃣年终奖

2️⃣迷宫问题


1️⃣年终奖

年终奖_牛客题霸_牛客网 (nowcoder.com)

描述

       小东所在公司要发年终奖,而小东恰好获得了最高福利,他要在公司年会上参与一个抽奖游戏,游戏在一个6*6的棋盘上进行,上面放着36个价值不等的礼物,每个小的棋盘上面放置着一个礼物,他需要从左上角开始游戏,每次只能向下或者向右移动一步,到达右下角停止,一路上的格子里的礼物小东都能拿到,请设计一个算法使小东拿到价值最高的礼物。

给定一个6*6的矩阵board,其中每个元素为对应格子的礼物价值,左上角为[0,0],请返回能获得的最大价值,保证每个礼物价值大于100小于1000。

解题思路:

       这道题问题是使小东拿到价值最高的礼物,也就是说每次都需要上一步中拿到最高价值的礼物,从而推导到最后的大规模拿到最高(最优)价值的礼物——动态规划。

       小东每次只能向下或者向右移动一步,也就是说当前问题解的来源只能是向上和向左中来。

        递推公式:dp[ i ] [ j ]=max(dp[ i-1] [ j ] , dp[ i ] [ j -1 ] )+ board[ i ] [ j ]

         另外我们还应当注意到边界情况:

  • 当i=0时,每次的最大价值只能从左边中来:dp[ i ] [ j ]=dp[ i ] [ j-1 ]+board[ i ] [ j ]
  • 当j=0时,每次的最大价值只能从上边中来:dp[ i ] [ j ]=dp[ i-1 ] [ j ]+board[ i ] [ j ]

代码实现:

class Bonus {
public:
    int getMost(vector<vector<int> > board) {
        int ROW=board.size();//获取行
        int COL=board[0].size();//获取列

        vector<vector<int>>allPrice(ROW,vector<int>(COL,0));//记录已获得的礼物价值
        allPrice[0][0]=board[0][0];

        for(int i=0;i<ROW;i++)
        {
            for(int j=0;j<COL;j++)
            {
                if(i==0&&j==0)
                    continue;
                if(i==0)
                {
                    allPrice[i][j]=allPrice[i][j-1]+board[i][j];
                    //获取i=0的礼物价值,只能是左边已获得价值加当前价值
                }
                else if(j==0)
                {
                    allPrice[i][j]=allPrice[i-1][j]+board[i][j];
                    //获取j=0的礼物价值,只能是上边已获得价值加当前价值
                }
                else {
                    allPrice[i][j]=board[i][j]+max(allPrice[i-1][j],allPrice[i][j-1]);
                    //其他位置的最大价值,为左边或者上面最大价值+当前价值
                }
            }
        }
        return allPrice[ROW-1][COL-1];
    }
};

2️⃣迷宫问题

迷宫问题_牛客题霸_牛客网 (nowcoder.com)

描述

定义一个二维数组 N*M ,如 5 × 5 数组下所示:


int maze[5][5] = {
0, 1, 0, 0, 0,
0, 1, 1, 1, 0,
0, 0, 0, 0, 0,
0, 1, 1, 1, 0,
0, 0, 0, 1, 0,
};

它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的路线。入口点为[0,0],既第一格是可以走的路。

注意:不能斜着走!

数据范围: 2≤n,m≤10  , 输入的内容只包含: 0≤val≤1 

输入描述:

输入两个整数,分别表示二维数组的行数,列数。再输入相应的数组,其中的1表示墙壁,0表示可以走的路。数据保证有唯一解,不考虑有多解的情况,即迷宫只有一条通道。

输出描述:

左上角到右下角的最短路径,格式如样例所示。

示例1:

输入:

5 5
0 1 0 0 0
0 1 1 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0

输出:

(0,0)
(1,0)
(2,0)
(2,1)
(2,2)
(2,3)
(2,4)
(3,4)
(4,4)

示例2:

输入:

5 5
0 1 0 0 0
0 1 0 1 0
0 0 0 0 1
0 1 1 1 0
0 0 0 0 0

输出:

(0,0)
(1,0)
(2,0)
(3,0)
(4,0)
(4,1)
(4,2)
(4,3)
(4,4)

解题思路: 

        1.从入口开始进行dfs搜索,每到一个点,入临时路径数组(path)并将当前位置建“墙”,表示已达。

        2.判断是否到达终点,若到达终点,判断当前结果数组(res)是否为空||结果数组(res)大小>临时路径数组(path)大小(为了找到最短路径),进行结果数组的替换。

        3.若未到终点,从4个方向进行遍历搜索,若无"墙"(0),即可以达到。

        4.若4个方向都不可达,即进入死路,开始回溯!!

代码实现:

#include <iostream>
#include <vector>
using namespace std;

vector<pair<int,int>>res;
vector<pair<int,int>>path;
vector<vector<int>>map;
int ROW,COL;

void dfs(int x,int y)
{
    map[x][y]=1;//走过,建墙
    path.push_back(make_pair(x,y));
    //走到终点
    if(x==ROW-1&&y==COL-1)
    {
        //返回res
        if(res.empty()||res.size()>path.size())
        {
            res=path;
        }
    }
    //未走到终点,开始遍历走迷宫
    //向右走
    if(y+1<COL&&map[x][y+1]==0)
        dfs(x,y+1);
    //向下走
    if(x+1<ROW&&map[x+1][y]==0)
        dfs(x+1,y);
    //向左走
    if(y-1>=0&&map[x][y-1]==0)
        dfs(x,y-1);
    //向上走
    if(x-1>=0&&map[x-1][y]==0)
        dfs(x-1,y);
    
    //走到死路,恢复标记墙,开始回溯
    map[x][y]=0;
    path.pop_back();//退出路径
}

int main() 
{
    while(cin>>ROW>>COL)
    {
        map=vector<vector<int>>(ROW,vector<int>(COL,0));
        res.clear();//清空上次的数据
        path.clear();//清空上次的数据
        for(int i=0;i<ROW;i++)
        {
            for(int j=0;j<COL;j++)
            {
                cin>>map[i][j];
            }
        }
        dfs(0,0);
        for(auto& e:res)
        {
            cout<<"("<<e.first<<","<<e.second<<")"<<endl;
        }
    }
    return 0;
}

文末结语,本篇记录了2道牛客习题,1道动态规划的简单题(年终奖);1道DFS+回溯的中等题(迷宫问题),本文旨在记录,如有需要,希望能有所帮助!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/849288.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux学习-1

Linux学习-1 1.文件系统的常识 本文主要引用鸟哥的Linux私房菜 1.1 常见的标识介绍 > [-][rwx][r-x][r--] > 1 234 567 890 1 为&#xff1a;代表这个文件名为目录或文件&#xff0c;本例中为文件&#xff08;-&#xff09;&#xff1b; 234为&#xff1a;拥有者的权限…

MongoDB数据库操作及操作命令

目录 一、基础概念 二、安装mongod 三、命令交互数据库 &#xff08;1&#xff09;数据库命令 &#xff08;2&#xff09;集合命令 &#xff08;3&#xff09;文档命令 四、Mongoose &#xff08;1&#xff09;增加一条数据 &#xff08;2&#xff09;插入多个数据 &am…

React实现关键字高亮

先看效果&#xff1a; 实现很简单通过以下这个函数&#xff1a; highLight (text, keyword ) > {return text.split(keyword).flatMap(str > [<span style{{ color: red, fontWeight: bold }}>{keyword}</span>, str]).slice(1);}展示某段文本时调用该函数…

【从零开始学习JAVA | 第四十二篇】初学网络编程

目录 前言&#xff1a; 什么是网络编程&#xff1a; 网络编程的应用场景&#xff1a; 常见的软件架构&#xff1a; CS架构&#xff1a; BS架构&#xff1a; 网络编程三要素&#xff1a;​ 总结&#xff1a; 前言&#xff1a; 当今互联网已经渗透到我们日常生活的方方面…

【MongoDB】万字长文,命令与代码一一对应SpringBoot整合MongoDB之MongoTemplate

目录 一、导入依赖与配置信息 二、导入测试数据创建实体类 三、插入数据 1、Insert默认集合插入 2、Insert指定集合插入 3、Insert批量插入数据 4、save默认集合插入 5、save指定集合插入 6、insert与save的区别 四、修改数据 1、修改符合条件的第一条数据 2、全…

单例模式-java实现

介绍 单例模式的意图&#xff1a;保证某个类在系统中有且仅有一个实例。 我们可以看到下面的类图&#xff1a;一般的单例的实现&#xff0c;是属性中保持着一个自己的私有静态实例引用&#xff0c;还有一个私有的构造方法&#xff0c;然后再开放一个静态的获取实例的方法给外界…

golang内存对齐

为什么要内存对齐&#xff1f; CPU访问内存时&#xff0c;以CPU的位数为单位进行访问。 如果访问未对齐的内存&#xff0c;处理器需要做两次内存访问&#xff0c;对齐的内存的访问可能仅需要一次&#xff0c;利用内存对齐后提升读取速度。 golang结构体内存对齐规则 在代码编译…

MySql学习3:常用函数

常用字符串函数 CHAR_LENGTH(s)&#xff1a;返回字符串的长度 select *, char_length(name) as nameLength from emp;CONCAT(s1,s2…sn)&#xff1a;字符串拼接 select name,concat(name,入职时间&#xff1a;,entrydata) as 入职时间 from emp;CONCAT_WS(x, s1,s2…sn)&a…

24v转3.3v输出3A用什么芯片

问&#xff1a;客户需要一个能够将24V输入电压转换为3.3V输出电压&#xff0c;并且能够提供1-3A的电流输出的芯片。还希望它能够内置MOS管。有什么推荐的型号吗&#xff1f;&#xff08;vin24v、5v&#xff0c;vout3.3v&#xff0c;Io1-3A&#xff09; 答&#xff1a;推荐使用…

Unity游戏源码分享-塔防游戏保卫兔子的食物CarrotFantasy

Unity游戏源码分享-塔防游戏保卫兔子的食物CarrotFantasy 经典塔防游戏&#xff0c;可发布PC、Andoid、IOS、Web等 下载地址&#xff1a;https://download.csdn.net/download/Highning0007/88189987

【Spring Boot】Thymeleaf模板引擎 — Thymeleaf页面布局

Thymeleaf页面布局 熟悉Thymeleaf的语法和表达式后&#xff0c;后面开发起来会更加得心应手。接下来好好研究一下Thymeleaf如何实现完整的Web系统页面布局。 1.引入代码片段 在模板中经常希望包含来自其他模板页面的内容&#xff0c;如页脚、页眉、菜单等。为了做到这一点&a…

【从零开始学习JAVA | 三十九篇】深入多线程

目录 前言&#xff1a; ​1.线程的寿命周期​ 2.线程的安全问题 3.锁 同步代码块&#xff1a; 同步方法&#xff1a; 死锁&#xff1a; 4.生产者和消费者模式&#xff08;等待唤醒机制&#xff09; 总结&#xff1a; 前言&#xff1a; 当今软件开发领…

构建Docker容器监控系统(2)(Cadvisor +Prometheus+Grafana)

Cadvisor产品简介 Cadvisor是Google开源的一款用于展示和分析容器运行状态的可视化工具。通过在主机上运行Cadvisor用户可以轻松的获取到当前主机上容器的运行统计信息&#xff0c;并以图表的形式向用户展示。 接着上一篇来继续 部署Cadvisor 被监控主机上部署Cadvisor容器…

Echart(v5)实现中国地图区域图

一、需求背景 需要实现一个中国地图的区域图&#xff08;区域级别到市&#xff09;&#xff0c;并且指定区域可以高亮。 二、相关工具 1、中国的GeoJSON数据获取&#xff1a;DataV.GeoAtlas地理小工具系列 2、Echart组件库 Apache ECharts 三、实现 echart配置&#xff1a; …

MySQL查看当前数据库视图-SQL语句

引言 查询语句为&#xff1a; show full tables where table_type 可查询当前数据库表 一&#xff0c;创建一个视图 # 创建视图 create view v_stu as # 视图内容&#xff08;连接的一个表&#xff09; select name from t_stu union all select tname from t_teach; 二&…

RISC-V云测平台:Compiling The Fedora Linux Kernel Natively on RISC-V

注释&#xff1a;编译Fedora&#xff0c;HS-2 64核RISC-V服务器比Ryzen5700x快两倍&#xff01; --- 以下是blog 正文 --- # Compiling The Fedora Linux Kernel Natively on RISC-V ## Fedora RISC-V Support There is ongoing work to Fedora to support RISC-V hardwar…

2.4 网络安全新技术

数据参考&#xff1a;CISP官方 目录 云计算安全大数据安全移动互联网安全物联网安全工业互联网安全 一、云计算安全 1、云计算定义 云计算是指通过网络访问可扩展的、灵活的物理或虚拟共享资源池&#xff0c;并按需自助获取和管理资源的模式。在云计算中&#xff0c;计算资…

Goland搭建远程Linux开发

Windows和Linux都需要先构建好go环境&#xff0c;启用ssh服务。 打开Windows上的Goland&#xff0c;建立项目。 点击添加配置&#xff0c;选择go构建 点击运行于&#xff0c;选择ssh 填上Linux机器的IP地址和用户名 输入密码 没有问题 为了不让每次运行程序和调试程序都生…

AIGC自动生成内容真的好吗

一、前言 博主认为某些技术领域的发展对人类而言&#xff0c;并没有多大的益处。反而让人类更加困扰。纵观这几十年的技术发展&#xff0c;日新月异&#xff0c;但是人类生活的幸福指数并没有提高&#xff0c;反而产生了无数的社会问题。 AI大模型迅速发展&#xff0c;A…

【Spring专题】手写简易Spring容器过程分析

前置知识 《【Spring专题】Spring底层核心原理解析》 思路整理 我们在上一节《【Spring专题】Spring底层核心原理解析》课里面有简单分析过一个Spring容器的一般流程&#xff0c;所以&#xff0c;本节课我们这里尝试写一下简易的Spring容器。 手写源码示例 一、手写前的准…