收集金币(人人网笔试)

2023-11-10

题目描述:

小M来到了一个迷宫中,这个迷宫可以用一个N*M的矩阵表示。在这个迷宫的某些位置中存在金币。一开始小M在迷宫的入口:矩阵的左上角,位置(1,1)处;迷宫的出口位于矩阵的右下角,位置(N,M)处。每一次小M可以选择向下或者向右走到一个相邻的格子,但是不能跨出迷宫外。现在小M想收集完迷宫中的所有金币并最后到达迷宫的出口,请你帮她规划一条最短的路径。

输入

第一行包含三个整数N,M,K,表示矩阵的规模以及金币的数目。

 2≤N,M≤100,0K1000

接下来K行每行包含两个整数Xi,Yi,表示第i个金币的位置,位于从上往下第Xi行,从左往右第Yi列。

1XiN,1YiM

输出

若不存在满足条件的路径,输出Impossible。

若最短路径存在,则输出小M移动的序列:

‘R’:表示向右;

  'D’:表示向下。

若存在多个答案,你需要输出字典序最小的答案。


样例输入

3 3 2

1 2

3 3

样例输出
RDDR

思路:首先将金币按坐标进行排序,怎么排序呢?排序规则是首先按横坐标X从小到大排序,然后如果两个点的横坐标X相等,则按照纵坐标Y从小到大进行排序,排完以后从起始位置依次到达这些金币的位置,就一定是一条最短的路径。由于本题只能向下或向右走,故在依次收集金币的时候需要判断当前坐标X和Y是否都不小于前一个金币位置的X和Y,如果是,则满足继续收集,否则,不满足退出,即不存在一条满足条件的最短路径。

如下图所示:A(1,2)、B(2,2)、C(1,3)、D(3,3)为金币所在位置,排序以后为A(1,2)、C(1,3)、B(2,2)、D(3,3)。从(1,1)位置开始,依次收集金币,当收集完金币C是,此时小M位于(1,3)的位置,由于只能向下或向右移动,故小M无法到达金币B的位置,因此不存在这样一条路径。同理先去收集金币B,也同样无法收集金币C。如果去掉金币C,则就可以依次收集金币ABD。移动的路径为RDDR。



代码实现如下:

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

struct node
{
    int x;
    int y;
};

//自定义排序比较规则
bool Compare(node n1, node n2) {
    if (n1.x != n2.x)
        return n1.x<n2.x;
    return n1.y < n2.y;
}

int main()
{
    int N, M, K;
    cin >> N >> M >> K;
    vector<node> arr(K);
    for (int i = 0; i < K; i++) {
        cin >> arr[i].x >> arr[i].y;
    }
    sort(arr.begin(), arr.end(), Compare);

    bool flag = true;    //标记是否存在最短路径
    string str;

    for (int i = 0; i < K; i++) {
        //从起始位置到第一个金币位置
        if (i == 0)
        {
            for (int j = 0; j < arr[i].x - 1; j++)
                str += "D";
            for (int j = 0; j < arr[i].y - 1; j++)
                str += "R";
        }
        else {
            if (arr[i].x >= arr[i - 1].x && arr[i].y >= arr[i - 1].y)
            {
                for (int j = 0; j < arr[i].x - arr[i - 1].x; j++)
                    str += "D";        //向下移动
                for (int j = 0; j < arr[i].y - arr[i - 1].y; j++)
                    str += "R";        //向右移动
            }
            else {
                flag = false;          //此时就出现了类似于金币B和C的情况
                break;
            }
        }
    }

    if (flag) {
        //最后需要到达出口位置
        for (int j = 0; j < N-arr[K-1].x; j++)
            str += "D";
        for (int j = 0; j < M-arr[K-1].y; j++)
            str += "R";
        cout << str << endl;
    }
    else
        cout << "Impossible" << endl;
    return 0;
}



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

收集金币(人人网笔试) 的相关文章

  • 五大常用经典算法

    五大常用算法之一 分治算法 一 基本概念 在计算机科学中 分治法是一种很重要的算法 字面上的解释是 分而治之 就是把一个复杂的问题分成两个或更多的相同或相似的子问题 再把子问题分成更小的子问题 直到最后子问题可以简单的直接求解 原问题的解即
  • 01背包问题变种:从长度为n的数组里选出m个数使和为固定值sum

    这个问题是我从leetcode上一道问题所想到的 原题 如果是从数组中选出2个数相加使之成为固定的数sum 这当然很简单 把数组中的数字遍历一遍 判断另一个数字是否也在数组中即可 代码如下 vector
  • 数据库多维迭代算法

    关键词 数据库 迭代 递归 多维 一 两种传统的数据库迭代结构算法 对于数据库的迭代结构 有两种传统的算法 递归算法和边界算法 比如对于下面图1的结构 图1 递归算法的数据结构如表1所示 节点id 节点值 父节点id 1 1111 2 3
  • Mysql 数据库

    数据库基础 1 什么是数据库 用来存储数据 数据库可在硬盘及内存中存储数据 数据库与文件存储数据的区别 数据库本质也是通过文件来存储数据 数据库的概念就是系统的管理存储数据的文件 数据库介绍 本质就是存储数据的C S架构的socket套接字
  • 《Linux From Scratch》第三部分:构建LFS系统 第六章:安装基本的系统软件- 6.29. Coreutils-8.23...

    Coreutils 软件包包含用于显示和设置基本系统特性的工具 大概编译时间 2 5 SBU 需要磁盘空间 193 MB 6 29 1 安装 Coreutils POSIX 要求 Coreutils 中的程序即使在多字节语言环境也能正确识别
  • 移动端按设计图1:1布局方法

    1 为什么要写这篇教程 移动端布局大多数前端工程师使用的是百分比布局 然而百分比布局造成了很多问题 比如图片在不同分辨率下会有变形的问题 高度需要按照分辨率去兼容适配等等 今天给大家分享的这种布局方式 可以摈弃百分比布局 直接根据设计图1
  • LeetCode83: 删除排序链表中的重复元素

    给定一个已排序的链表的头 head 删除所有重复的元素 使每个元素只出现一次 返回 已排序的链表 示例 1 输入 head 1 1 2 输出 1 2 示例 2 输入 head 1 1 2 3 3 输出 1 2 3 提示 链表中节点数目在范围
  • 4399 C++笔试题

    1 写出一个函数 取到链表中倒数第二个节点 双链表 node getSec List mylist return mylist m tail gt m prev m prev为链表前指针 单链表 node getSec List mylis
  • 用 Java 实现的八种常用排序算法

    八种排序算法可以按照如图分类 前置知识 1 算法稳定性 在一个序列中 能保证两个相等的数 经过排序之后 其在序列的前后位置顺序不变 A1 A2 排序前 A1 在 A2 前面 排序后 A1 还在 A2 前面 2 时间复杂度 时间复杂度是用于衡
  • 递归算法中的时间复杂度分析

    对于一种算法的时间复杂度分析还是特别重要的 在一些非递归算法中 我们仅仅看运算次数最多的那一行代码可能执行多少次就可以 实际就是看在循环中变量的变化 但是对于递归算法中该怎么分析呢 下面介绍几种递归函数中的算法时间复杂度分析的方法 0 递推
  • 数据结构——计算节点个数和二叉树高度(C语言版)

    摘自 数据结构 计算节点个数和二叉树高度 C语言版 作者 正弦定理 发布时间 2020 12 12 23 27 09 网址 https blog csdn net chinesekobe article details 111086664
  • 如何防止过拟合和欠拟合

    过拟合和欠拟合是模型训练过程中经常出现的问题 两种情况正好相反 现将两者的定义及如何防止进行简要总结 1 过拟合 1 1 定义 是指模型对于训练数据拟合呈现过当的情况 反映到评估指标上就是模型在训练集上的表现很好 但是在测试集上的表现较差
  • 人工智能概念

    人工智能概念 人工智能就是用人工方法在机器 计算机 上实现的智能 或称机器智能 即是研究如何用计算机来表示和执行人类的智能活动 以模拟人脑所从事的推理 学习 思考和规划等思维活动 并解决需要人类的智力才能处理的复杂问题 如医疗诊断 管理决策
  • 数理统计知识整理——回归分析与方差分析

    题记 时值我的北科研究生第一年下 选学 统计优化 课程 备考促学 成此笔记 以谨记 1 线性回归 1 1 原理分析 要研究最大积雪深度x与灌溉面积y之间的关系 测试得到近10年的数据如下表 使用线性回归的方法可以估计x与y之间的线性关系 线
  • 插入排序超详解释,一看就懂

    目录 一 插入排序的相关概念 1 基本思想 2 基本操作 有序插入 二 插入排序的种类 三 直接插入排序 1 直接插入排序的过程 顺序查找法查找插入位置 2 使用 哨兵 直接插入排序 四 直接插入排序算法描述 五 折半插入排序 1 查找插入
  • 索引优化之Explain 及慢查询日志

    索引 本质是数据结构 简单理解为 排好序的快速查找数据结构 以索引文件的形式存储在磁盘中 目的 提高数据查询的效率 优化查询性能 就像书的目录一样 优势 提高检索效率 降低IO成本 排好序的表 降低CPU的消耗劣势 索引实际也是一张表 该表
  • 用两个栈实现队列

    目录 一 栈的基本结构及其接口 二 我的队列结构定义 三 我的队列创建及其初始化 四 我的队列入队 五 我的队列出队 六 我的队列取队头元素 七 我的队列判空 八 我的队列销毁 一 栈的基本结构及其接口 栈的结构定义 typedef int
  • 【数据结构入门精讲 | 第二篇】一文讲清算法复杂度

    上篇文章中我们引入了算法 数据结构 数据类型等概念 而要想衡量一个算法与数据结构是否为优质的 就需要一个衡量标准 这个衡量标准也是在我们实现一个好的算法时要遵循的原则 目录 基本概念 渐进性态 渐进性态数学表征 算法复杂度的运算 顺序搜索算
  • C++ AVL树(四种旋转,插入)

    C AVL树 四种旋转 插入 一 AVL树的概念及性质 二 我们要实现的大致框架 1 AVL树的节点定义 2 AVL树的大致框架 三 插入 1 插入逻辑跟BST相同的那一部分 2 修改平衡因子
  • 从源码角度来谈谈 HashMap

    HashMap的知识点可以说在面试中经常被问到 是Java中比较常见的一种数据结构 所以这一篇就通过源码来深入理解下HashMap 1 HashMap的底层是如何实现的 基于JDK8 1 1 HashMap的类结构和成员 HashMap继承

随机推荐

  • phpstudy小皮 sqli-libs 靶场搭建

    sqli libs靶场搭建 1 下载靶场 sqli labs mster https github com Audi 1 sqli labs archive refs heads master zip 解压 2 下载 安装 phpstudy
  • Python(解非线性方程和线性方程)求水力学法向深度-浪涌高度速度及互连反应器中的浓度和流体分布

    非线性方程 在水力学领域遇到的非线性方程的一个例子是通过长梯形通道寻找流动的法向深度 y n y n yn 这样的流动深度出现在均匀流动区域 远离任何不均匀原因的影响 例如堰的上游 法向深度 y
  • 《GPT-4技术报告》【中文版、英文版下载】

    大预言模型时代已经到来 但是真正的智能之路还很长 一 以下是连接 大家请自取 英文原版 https arxiv org pdf 2303 08774 pdfhttps arxiv org pdf 2303 08774 pdf 中文翻译版本
  • 最大信息系数mic python_生物信息学

    论文剖析 热门论文 AgeGuess 一种预测人类年龄的甲基化模型 1 介绍 衰老是一个生物过程 受到遗传因子和细胞内各种分子修饰的影响 多项研究表明 使用甲基组数据可以准确预测实际年龄 本篇文章针对年龄回归问题 提出了一种三步特征选择算法
  • 【SpringBoot】pom中的变量

    在Maven项目的pom xml文件中 可以使用多个预定义变量 以下是一些常用的变量 project basedir 项目根目录的绝对路径 project build directory 构建目录的绝对路径 通常为target projec
  • mybatis_plus

    目录 一 简介 二 特性 三 快速入门 一 创建并初始化数据库 1 创建数据库 2 创建 User 表 二 初始化工程 三 添加依赖 1 引入依赖 2 idea中安装lombok插件 四 配置 五 编写代码 1 主类 2 实体 3 mapp
  • [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.(入职小灰)

    mariadb剧本安装后自动重启不了 飞要一次手动重启 这对于重要业务来说是致命的 今天遇到的错误 ERROR Can t open the mysql plugin table Please run mysql upgrade to cr
  • threejs教程(一)

    插件安装 npm i three 项目引入 这里我随便找的VUE项目练习的 import as THREE from three 大致介绍一下threejs的逻辑 一般我们用它是来搭建三维模型的 搭建三维模型就需要的三个要素 场景 scen
  • 【Xilinx Vivado 时序分析/约束系列11】FPGA开发时序分析/约束-FPGA DDR-PLL接口的 input delay 约束优化方法

    目录 DDR PLL 简述 实际操作 实际工程 顶层代码 PLL配置 添加时钟约束 添加 input delay 约束 添加 False Path Setup Time Hold Time Multicycle约束 解决办法 PLL配置 发
  • css transition 实现滑入滑出

    transition是css最简单的动画 通常当一个div属性变化时 我们会立即看的变化 从旧样式到新样式是一瞬间的 嗖嗖嗖 但是 如果我希望是慢慢的从一种状态 转变成另外一种状态 怎么办 transition可以做到 第一问 哪些属性值变
  • 电脑连着无线wifi(外网)和有线内网,如何实现双网访问?

    做交付难免会遇到 需要开发远程解决问题 但是客户方是内网 开发无法远程 因为自己遇到很多次 记性又差 所以就写着给自己看看 以管理员身份运行命令提示符 场景描述 访问地址 http 172 31 27 15 内网必须要可以访问这个地址 内网
  • CUID卡写入错误数据被锁死——入坑NFC的一段经历

    最开始想到做NFC是还在学校上自习的时候 学校有种氛围很好的自习室 每个位置都是一个小隔间 小隔间里还有小灯和插座以及网线口 但是需要插卡取电 对就是用很普通的那种校园卡插进去就有电了 这个校园卡是NFC卡 但是学校很nt的一点是只有上一届
  • vue 项目中通过监听 localStorage 的变化进行父子页面传参

    vue实时监听 localStorage 变化 应用场景 1 页面B需要实时获取页面A数据更改 2 父子页面之间的传参 代码实例 B页面实时获取A页面的数据变化 在 页面A 进行缓存修改or插入缓存 localStorage setItem
  • MySQL8.0_JDBC笔记

    第一章 JDBC概述 之前我们学习了JavaSE 编写了Java程序 数据保存在变量 数组 集合等中 无法持久化 后来学习了IO流可以将数据写入文件 但不方便管理数据以及维护数据的关系 后来我们学习了数据库管理软件MySQL 可以方便的管理
  • Java对象的生命周期

    Java对象的生命周期 Java语言除了原始数据类型外 还有一种类型被称之为引用类型 对象的创建一般需要使用new关键字 将创建的对象存储在堆上 heap 而在线程栈中会保留一个指向堆上地址的引用 下图将展示堆栈之间的具体关系 栈中被分割成
  • [UE4] C++实现Delegate Event实例(例子、example、sample)

    相关文章 如何用蓝图实现Delegate Event http aigo iteye com blog 2269663 原文作者 玄冬Wong 转载请注明出处 http aigo iteye com blog 2301010 虽然官方doc
  • 数据库实验3-单表查询

    2021011203 1 查询全体学生的姓名 出生年份和所在系 2 查询选修了课程的学生学号 SELECT DISTINCT sno FROM scfcy WHERE cno IS NOT NULL distinct去除重复的 从名为scf
  • Python 循环嵌套

    Python 语言允许在一个循环体里面嵌入另一个循环 Python for 循环嵌套语法 for iterating var in sequence for iterating var in sequence statements s st
  • 有什么职业入行时间短,薪资高?

    有什么职业入行时间短 薪资高 1 可以通过短期 半年以内 的学习入行 2 入职后 排除运气等不可控因素 能拿到 10k 以上 百分之十的人能做到就算 3 工作期间晚上有极其充足的生物钟休息时间 4 能用脑子解决的事情别用体力 说到入行时间短
  • 收集金币(人人网笔试)

    题目描述 小M来到了一个迷宫中 这个迷宫可以用一个N M的矩阵表示 在这个迷宫的某些位置中存在金币 一开始小M在迷宫的入口 矩阵的左上角 位置 1 1 处 迷宫的出口位于矩阵的右下角 位置 N M 处 每一次小M可以选择向下或者向右走到一个