关于程序设计大作业力扣174题地下城游戏的可视化实现(C++)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:
尝试用EasyX对LeetCode174.地下城游戏这一题进行一个简单的可视化。
做到标注出最小路径,记录最小初始生命值。
顺便以本文记录一下作者学习编写的心路历程。
计算机纯新人第一次写博客记录,有任何问题和建议欢迎提出。​​​​​​
提示:以下是本篇文章正文内容,下面案例可供参考

一、题目及运行结果

​​在这里插入图片描述
运行结果:
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/2d74edf98cad4a429bbfa8316e4f6f32.png在这里插入图片描述
在这里插入图片描述

二、具体思路及代码实现

1.基本思路

对于该题目的可视化实现,应该首先先明确一下思路,要确定要做什么,画什么?
我给出的几个步骤是:
1.绘制表格 n * m
2.插入图片(骑士,公主),绘制数字(怪物(扣血),魔法球(加血))
3.计算最小生命值,并利用其中的dp数组还原最佳路径并标示
4.健康点数设定

窗口设定 960*640(当m,n较大时可酌情调整,此处将其固定)

2.代码实现

图片插入:通过文件路径引用随便插两张图片

IMAGE Knight;
loadimage(&Knight, L".png", width, height);
putimage(x+1, y+1, &Knight);

初始化窗口initwindow:用于负责绘制n*m的迷宫且为迷宫dungenon每一格随机生成-10~10以内的数字并将其显示在迷宫中

void initwindow(vector<vector<int>>& dungeon,int& Cell,int& n,int& m){
   
   
	initgraph(Width, Height);
	for (int i = 80; i < 80+n*Cell; i += Cell){
   
   
		for (int j = 80; j < 
<think>我们参考引用[3]中提供的C++代码实现,该代码使用了一个普通队列(FIFO)和一个双端队列(单调递减队列)来实现自助结算系统。功能说明:-add(intvalue):添加商品到队列中,同时维护单调递减队列(确保队首是最大值)-remove():移除最先加入的商品(队首元素),如果这个元素恰好是当前最大值,则同时从单调队列中移除-get_max():获取当前队列中的最大值(即单调队列的队首元素)代码实现如下:</think>### 力 LCR184:设计自助结算系统 C++ 实现 #### 设计思路 基于**队列+单调递减双端队列**实现: 1. **普通队列**:维护商品结算的先进先出顺序 2. **单调队列**:维护当前队列中的最大值(队首始终为最大值) ```mermaid graph LR A[普通队列] -->|存储原始顺序| C[商品流] B[单调递减队列] -->|维护最大值| C C --> D[添加商品] C --> E[移除商品] C --> F[获取最高价] ``` #### C++ 实现代码 ```cpp #include <queue> #include <deque> using namespace std; class Checkout { private: queue<int> normalQueue; // 普通队列(FIFO) deque<int> maxDeque; // 单调递减双端队列(维护最大值) public: Checkout() {} // 构造函数 // 添加商品 void add(int value) { normalQueue.push(value); // 维护单调队列:移除尾部小于当前值的元素 while (!maxDeque.empty() && maxDeque.back() < value) { maxDeque.pop_back(); } maxDeque.push_back(value); } // 移除最先加入的商品 int remove() { if (normalQueue.empty()) return -1; int removed = normalQueue.front(); normalQueue.pop(); // 若移除的是最大值,同步更新单调队列 if (removed == maxDeque.front()) { maxDeque.pop_front(); } return removed; } // 获取当前最高价格 int get_max() { return maxDeque.empty() ? -1 : maxDeque.front(); } }; ``` #### 关键操作解析 1. **添加商品**(`add`): ```cpp while (!maxDeque.empty() && maxDeque.back() < value) { maxDeque.pop_back(); // 移除尾部小于新值的元素 } maxDeque.push_back(value); // 添加新值到尾部 ``` 2. **移除商品**(`remove`): ```cpp if (removed == maxDeque.front()) { maxDeque.pop_front(); // 同步移除单调队列中的最大值 } ``` 3. **时间复杂度**: - `add()`: 均摊 $O(1)$(每个元素最多入/出单调队列一次) - `remove()`: $O(1)$ - `get_max()`: $O(1)$ #### 测试示例 ```cpp int main() { Checkout checkout; checkout.add(8); // 队列: [8], 最大值=8 checkout.add(3); // 队列: [8,3], 最大值=8 cout << checkout.get_max() << endl; // 输出 8 checkout.add(10); // 队列: [8,3,10], 最大值=10 checkout.remove(); // 移除8 → 队列: [3,10], 最大值=10 cout << checkout.get_max() << endl; // 输出 10 return 0; } ``` #### 设计优势 1. **对象模型契合问域**:通过分离普通队列和单调队列,使状态管理更符合结算系统需求[^1] 2. **高效最大值维护**:单调队列确保最高价查询 $O(1)$ 复杂度 3. **空间优化**:单调队列仅存储递减序列,空间占用 $O(n)$ 最坏情况 #### 相关扩展 1. **动态折计算**:在`add()`方法中加入折因子计算 ```cpp void add(int value, float discount) { int finalPrice = value * discount; // ... 后续相同 } ``` 2. **线程安全**:添加互斥锁实现多线程安全 ```cpp #include <mutex> mutex mtx; void add(int value) { lock_guard<mutex> lock(mtx); // ... 原逻辑 } ``` --- ### 相关问 1. 如何实现结算系统的动态折功能(如满100减20)? 2. 在多线程高并发场景下如何优化该结算系统? 3. 如果要求实时获取中位数而非最大值,数据结构应如何调整? 4. 单调队列在哪些其他算法问中有典型应用?[^3] 5. 如何扩展系统以支持商品信息(名称、数量)而不仅是价格?[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值