蓝桥杯 试题 算法提高 网格贪吃蛇(C++)

DP(01背包)+离散化——网格贪吃蛇 蓝桥杯 试题 算法提高 网格贪吃蛇(C++) 离散化的步骤: 排序,去重 得到的序列中元素的位置就是离散化后的坐标。 例如(2,5) (1000,500) (1000, 999) 先将所有数字放入数组中并排序去重得到: 2,5,500,999,1000 离散化后的坐标就是 (1,2) (5,3) (5,4) 该题中地图很大,无法开这么大的二维数组。但实际给出的点就1000个点,所以需要进行离散化。 注意,虽然只有1000个点,但却有2000个数,所以N要定到2000以上。 参考文章: #include&.. 阅读详情

题目浏览

资源限制
时间限制:1.0s 内存限制:256.0MB

问题描述
  那个曾经风靡全球的贪吃蛇游戏又回来啦!这次贪吃蛇在m行n列的网格上沿格线爬行,从左下角坐标为(0,0)的格点出发,在每个格点处只能向上或者向右爬行,爬到右上角坐标为(m-1,n-1)的格点时结束游戏。网格上指定的格点处有贪吃蛇喜欢吃的豆豆,给定网格信息,请你计算贪吃蛇最多可以吃多少个豆豆。
  
输入格式
  输入数据的第一行为两个整数m、n(用空格隔开),分别代表网格的行数和列数;第二行为一个整数k,代表网格上豆豆的个数;第三行至第k+2行是k个豆豆的横纵坐标x、y(用空格隔开)。
  
输出格式
  程序输出一行,为贪吃蛇可吃豆豆的最大数量。
  
样例输入

10 10
10
3 0
1 5
4 0
2 5
3 4
6 5
8 6
2 6
6 7
3 1

样例输出

5

数据规模和约定
   1 ≤ m , n ≤ 1 0 6 , 0 ≤ x ≤ m − 1 , 0 ≤ y ≤ n − 1 , 1 ≤ k ≤ 1000 1≤m, n≤10^6,0≤x≤m-1,0≤y≤n-1,1≤k≤1000 1≤m,n≤106,0≤x≤m−1,0≤y≤n−1,1≤k≤1000

算法浏览

(这边建议看新写的代码, 这个代码太拉了)

#include<iostream>
#include<algorithm>
#include<map>
#include<vector>
#include<set>

#define x first
#define y second

using namespace std;

typedef pair<int, int> PII;

const int N = 1010;

int n, m, k;
int g[N][N];
int dp[N][N];
vector<PII> node;
map<int, int> dx;//x对应的坐标
map<int, int> dy;//y对应的坐标

int main()
{
    cin >> m >> n >> k;
    for(int i = 0; i < k; i++)//读入每个点
    {
        int x, y;
        scanf("%d%d", &x, &y);
        PII temp(x,y);
        node.push_back(temp);
        dx[x] = 0;
        dy[y] = 0;
    }

    int nx,ny;//映射以后的长度和宽度
    int j = 1;
    for(map<int, int> :: iterator i = dx.begin(); i != dx.end(); i++, j++) i->second = j;//设置每个值对应的映射值 x坐标
    nx = j - 1;

    j = 1;
    for(map<int, int> :: iterator i = dy.begin(); i != dy.end(); i++, j++) i->second = j;//设置每个值对应的映射值 y坐标
    ny = j - 1;
    
    for(int i = 0; i < node.size(); i++)//将映射后的坐标在图上标注出来
    {
        PII temp = node[i];
        g[dx[temp.x]][dy[temp.y]] = 1;
    }
	//动态规划
    for(int i = 1; i <= nx; i++){
        for(int j = 1; j <= ny; j++)
        {
            dp[i][j] = g[i][j];
            dp[i][j] += max(dp[i - 1][j], dp[i][j - 1]);
        }
    }

    cout << dp[nx][ny] << endl;
    return 0;
}

核心思路

本题考查的是离散化

首先先看一下这个数据范围,可以知道,地图很大,但是点数很稀疏,这个情况怎么办?
若将每个点直接在地图上标注出来以后会浪费大量的时间在计算没有意义的点(实际上也根本开不出来这么大的地图)

所以可以将根本没有用到的行和列剔除掉,换一种思路,即分别计算x轴和y轴各个点之间的相对的位置
。
举个例子(2, 5), (1000, 633), (1000,800), (2560,48520)可以映射成(1,1), (2,2), (2,3), (3, 4)这样就可以将一个很大的地图变成一个很小的地图,再在这个很小的地图上做动态规划可以通过用例。

✨2022-4-2日新增的内容✨

这几天学了一下离散化,然后想到这道题可以使用离散化的思想来写出来, 其实我之前的代码也是用的是离散化的思想来写出来的,但是那个东绕西绕的很容易想的混乱,所以今天借此机会,又重新写了一遍代码,另外加上了注释

同时,这个是我整理出来离散化的笔记 : 链接

c++代码

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

typedef pair<int, int> PII;

const int N = 2010;	// 要离散化每个点的坐标, 而总共会有1000个点, 每个点2个数字,所以地图要开2000的大小 

int n, m ,k;
int g[N][N];	// 离散化后的地图 
int dp[N][N];	// 背包问题 
vector<int> alls;	// 离散化的点的位置 
vector<PII> loc;	// 待离散化的点的坐标 

int find(int x) {	// 查找点x离散化后的数 
	int l = 0, r = alls.size();	// 二分法 
	while (l < r) {
		int mid = (l + r) >> 1;
		if (alls[mid] >= x) r = mid;
		else l = mid + 1;	
	}
	return l;
}

int main() {
	cin >> n >> m; // 先输入n行, m列 
	cin >> k;
	while (k --) {
		int x, y;
		cin >> x >> y;
		loc.push_back({x, y});	// 将该点输入到待离散化的vector中 
		alls.push_back(x);	// 将数字添加到待离散化的数字中 
		alls.push_back(y);
	}
	
	// 离散化 + 去重 
	sort(alls.begin(), alls.end());
	alls.erase(unique(alls.begin(), alls.end()), alls.end());
	
	for (int i = 0, len = loc.size(); i < len; i++) {	// 将每个坐标离散化后的坐标添加到地图中 
		PII item = loc[i];
		g[find(item.first) + 1][find(item.second) + 1] = 1;
	}
	
	/* 这个地方这样写也可以,但是蓝桥杯的练习系统不支持c++11,所以就只能用上面的那种写法了 
	for (auto item : loc) {
		g[find(item.first) + 1][find(item.second) + 1] = 1;
	}
	*/
	
	int len = alls.size();	// 01背包问题 
	for (int i = 1; i <= len; i++)
		for (int j = 1; j <= len; j++) {
			dp[i][j] = g[i][j];
			dp[i][j] += max(dp[i - 1][j], dp[i][j - 1]);
		}
	
	cout << dp[len][len] << endl; // 输出答案 
	return 0;
}

注意
本次的代码和上次的代码在离散化的地方有些不同, 之前的代码是分别离散化x轴和y轴的坐标, 而这次的代码则是同时离散化x轴 + y轴的坐标

c++实现经典游戏贪吃蛇(超详解) c++实现经典游戏贪吃蛇(超详解) 要求: 1碰到四周和自身游戏结束; 2迟到食物蛇身增长; 3食物吃得越多游戏越快; 4通过w,a,s,d可控制蛇头的方向; 5蛇身颜色不一致。 源码(需要easy-x) 阅读详情

相关推荐

【蓝桥杯国赛真题9】Scratch贪吃蛇 少儿编程scratch蓝桥杯国赛真题讲解

scratch贪吃蛇 一、题目要求 1、编程实现 贪吃蛇游戏:通过控制蛇头方向吃到食物,从而使得蛇变的越来越长 2、具体要求 点击绿旗,绘制出舞台上面的格子,间隔20 开始舞台上出现面向右侧的蛇头,和随机位置格子里的苹果 通过上下左右四个方向键,控制蛇头的上下左右移动 蛇头碰到舞台边缘后,可以从舞台另一侧的位置出来 每次吃掉苹果(蛇头和苹果在同一格子内,苹果即消失),蛇头后增加一个正方形身体,同时苹果重新出现在随机位置格子内 吃掉6

青少年编程学习指导 3954

试题 算法提高 网格贪吃蛇(离散化 + DP)

内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s那个曾经风靡全球的贪吃蛇游戏又回来啦!这次贪吃蛇在m行n列的网格上沿格线爬行,从左下角坐标为(0,0)的格点出发,在每个格点处只能向上或者向右爬行,爬到右上角坐标为(m-1,n-1)的格点时结束游戏。网格上指定的格点处有贪吃蛇喜欢吃的豆豆,给定网格信息,请你计算贪吃蛇最多可以吃多少个豆豆。输入数据的第一行为两个整数m、n(用空格隔开),分别代表网格的行数和列数;

Easenyang的博客 1343

在pycharm2021.2中学习opencv图像处理,基于python3.9.7、pycharm完成配置

在pycharm中学习opencv图像处理安装python下载python安装包开始安装安装pycharm社区版下载pycharm开始安装如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 安装python 使用pycharm学习opencv应该是最简单的了,对新手比较友好,

steveqobs 7710

空间使用仅3.MB 蓝桥杯 算法提高 网格贪吃蛇 代码逐块讲解(C++)

离散化+滚动数组+动态规划,代码逐块讲解,内存使用仅2.972MB,耗时15ms,100%通过率

weixin_63622800的博客 648

工业相机图像格式深度解析:从Mono8到Mono12的选型与应用

本文深度解析工业相机黑白图像格式,重点对比Mono8、Mono10与Mono12的核心差异。文章从位深、动态范围和数据量等关键概念切入,详细阐述了不同格式的优缺点及适用场景,为工业视觉项目中的相机选型提供实战指南,帮助用户在精度、速度与成本间做出最优决策。

weixin_29207439的博客 263

5G协议栈逆向工程:基于开源模拟器的核心网信令分析实战

本文详细介绍了基于开源模拟器Free5GC和UERANSIM的5G协议栈逆向工程实战,涵盖核心网信令分析、环境搭建、认证协议解析及安全漏洞验证。通过NGAP/NAS信令交互解密和异常流量注入测试,帮助研究人员深入理解5G网络安全机制,并提供实用的安全加固建议。

weixin_29250573的博客 678

算法 — 网格贪吃蛇

那个曾经风靡全球的贪吃蛇游戏又回来啦!这次贪吃蛇在m行n列的网格上沿格线爬行,从左下角坐标为(0,0)的格点出发,在每个格点处只能向上或者向右爬行,爬到右上角坐标为(m-1,n-1)的格点时结束游戏。网格上指定的格点处有贪吃蛇喜欢吃的豆豆,给定网格信息,请你计算贪吃蛇最多可以吃多少个豆豆。蓝桥杯/Java

m0_59705760的博客 5141

保姆级教程:手把手教你用Python逆向分析极验4.0滑块验证码的w参数生成逻辑

本文提供了一份详细的Python逆向工程教程,手把手教你分析极验4.0滑块验证码的w参数生成逻辑。通过HTTP请求分析、JavaScript逆向和加密算法复现,帮助开发者深入理解验证码防护机制,并实现高效的自动化解决方案。教程涵盖AST反混淆、轨迹生成算法和AES加密等核心技术,适合中高级开发者提升逆向工程能力。

weixin_30172941的博客 304

贪吃蛇结束条件分析

蛇结束条件总结:1.蛇头撞自身结束    每次都判断蛇头坐标是否与蛇的第4节开始的坐标是否一致,如果相同,则结束;调用蛇身数组并判断2.蛇头撞障碍物结束    每移动一步都要判断蛇头坐标与障碍物的每一坐标是否相等,相等则结束。障碍物设置宏,调用Roadblock(INT8U level){ switch()        {  case 1 };}3.等达到升级条件时,结束调用下一级地图,初始化蛇

我的未来我做主 955

2026年运维工程师常见面试选择题

这篇文章总结了30道Linux运维面试常见问题及解析,涵盖基础命令、系统监控、故障排查、数据库、缓存、容器编排等多个方面。主要内容包括: 基础命令使用:如df查看磁盘、free查看内存、top监控进程等 系统监控与故障排查:负载判断、端口检查、进程管理等 中间件相关:Nginx状态码、MySQL主从复制、Redis缓存问题 容器技术:Docker优势、Kubernetes作用 运维理念:高可用、监控告警、发布策略、备份容灾 工作原则:故障处理优先级、运维工程师核心能力 文章不仅提供标准答案,还解析了各命令的

不务正业的猿 194

大数据预测分析:精准把握市场趋势

传统市场预测多依赖经验判断(比如“去年卖了1000件,今年加20%”)或小数据统计(比如用近6个月的销量做线性回归)。而大数据预测分析是:利用海量结构化+非结构化数据(销售、用户、社交媒体、天气等),通过机器学习/深度学习模型,挖掘数据中的关联关系与趋势规律,实现对未来市场走势的精准预测。更全面:覆盖内部(企业数据)+外部(行业、环境数据)的全维度数据;更精准:用算法替代人工,避免主观偏差;更实时:支持分钟级/小时级的实时预测(比如直播带货的销量预测)。错误做法。

AI智能探索者的博客 1025

VB 贪吃蛇

描述 给定一个金币地图,地图上的数值代表金币的数量。 此时地图上方有一只贪吃蛇从任意一点进入,每经过一处就会吞噬此处的金币。最终从地图下方出去。 贪吃蛇每次只会向下走,且不能走直线,也就是说,如果它在吞噬了地图中第 a 行第 b 列的 金币后,下一次只能走向第 a + 1行的第 c列(c != b) 求:该贪吃蛇能吞噬的最大金币数是多少。 输入 一个 m x n 的地图 a 1 ≤ m, n≤ 3000 1 ≤a[i][j]≤ 100 输出 输出一个整数,表示该贪吃蛇能吞噬的最大...

laocooon的博客 1841

XCP实战系列介绍09-基于Vehicle Spy进行XCP测量步骤详解

详细介绍如何使用Vehicle Spy进行XCP测量

initiallizer的博客 1393

信息学奥赛一本通C++版【20CSPS提高组】贪吃蛇

【题目描述】 草原上有n条蛇,编号分别为1,2,⋯,n。初始时每条蛇有一个体力值ai,我们称编号为x的蛇实力比编号为y的蛇强当且仅当它们当前的体力值满足ax>ay,或者ax=ay且x>y。 接下来这些蛇将进行决斗,决斗将持续若干轮,每一轮实力最强的蛇拥有选择权,可以选择吃或者不吃掉实力最弱的蛇: 1.如果选择吃,那么实力最强的蛇的体力值将减去实力最弱的蛇的体力值,实力最弱的蛇被吃掉,退出接下来的决斗。之后开始下一轮决斗。 2.如果选择不吃,决斗立刻结束。 每条蛇...

qj20120522的博客 1340

ROS从入门到精通0-1:教程导读

ROS概念太多太复杂?ROS从入门到精通系列订阅必看

FRIGIDWINTER的博客 1万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

试题 算法提高 网格贪吃蛇

问题描述 那个曾经风靡全球的贪吃蛇游戏又回来啦!这次贪吃蛇在m行n列的网格上沿格线爬行,从左下角坐标为(0,0)的格点出发,在每个格点处只能向上或者向右爬行,爬到右上角坐标为(m-1,n-1)的格点时结束游戏。网格上指定的格点处有贪吃蛇喜欢吃的豆豆,给定网格信息,请你计算贪吃蛇最多可以吃多少个豆豆。 输入格式   输入数据的第一行为两个整数m、n(用空格隔开),分别代表网格的行数和列数;第二行为一个整数k,代表网格上豆豆的个数;第三行至第k+2行是k个豆豆的横纵坐标x、y(用空格隔开)。 输出格式   程序

weixin_52746566的博客 3146

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

C++图形界面之贪吃蛇小游戏实验报告

前言: 工具:VS2017, 准备工作:需要下载图形界面库Easyx并将它安装在vs的目录下。附上链接: https://easyx.cn/ 一.实验过程 (1)项目功能 贪吃蛇是一款简单益智类的大众小游戏,自从诞生以来,深受广大玩家喜爱。此次设计传统的贪吃蛇小游戏,利用键盘的方向键控制蛇的移动,实现简单的贪吃蛇基本功能。我们将应用所学的理论知识解决一些复杂的工程问题。 (2)项目可行性分析 贪吃蛇的算法中包括几个重要的部分,例如:如何实现蛇的移动,蛇如何吃掉食物后实现自增,如何随机创建食物以

m0_46107987的博客 4272

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

蓝桥杯练习1163-1176

非VIP试题1163-1176

Sapphire8的博客 553

网格贪吃蛇的降维度优化

文章目录前言方案一将维存在问题解决方案 「这是我参与2022首次更文挑战的第28天,活动详情查看:2022首次更文挑战」 前言 今天早上,突然灵感一闪,好像想到了,先前我一直尝试把这个问题背包问题变形(蓝桥杯拿金币)与误区(网格贪吃蛇(求助))变成一个背包问题,这样我们就能够直接套公式去降低维度。但是的话这里有个问题就是那个豆子有可能在同一条直线上面,这样的话如果转化为背包问题,那么就出现了那个一个物品可能出现两个质量的情况,这样压根就优化不了。所以我们还是得回到我们的方案一上面。其实昨天晚上我是思考了三个

`or 1 or 不正经の泡泡 758

2011ACM大赛题目之贪吃蛇算法

一条贪吃的蛇在一个n*m的网格中游走,它只能从一个方格走向另一个相邻的方格,这里相邻的意思是两个方格有公共边。每个方格可以看作是一个房间,其中一些是空的,一些存放有苹果。贪吃的蛇根本不进入空的房间,而进入有苹果的房间后就可以带走所有苹果使房间成为空的。蛇从一个指定的房间出发,最终回到它的家,把一路带来的苹果存储到家中,当然,它希望带来的苹果最多。请编写程序,输入有整数n和m,及n*m的一个...

tudusi 844

贪吃蛇的算法分析

贪吃蛇是一款非常经典的手机游戏。它有很多算法,这里详细分析一种比较优秀的算法。首先介绍下主要用到的七个类:l          WormMain:最主要的类,控制所有其它类的运行和销毁。l          WormPit:处理键盘输入事件并实例化Worm类和WormFood类的。l          Worm:抽象了贪吃蛇的属性和动作l          WormFood:抽象了食物的属性和动作

bbiao的专栏 3426
上一篇: 蓝桥杯 试题 算法提高 搬运冰块(C ++)
下一篇: 蓝桥杯 试题 算法训练 勇士和地雷阵(C++)
ghost_him
博客等级 码龄6年 598粉丝 90原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值