
习题6-9 纸牌游戏("Accordian"Patience, UVa 127)
输入处理:读取用户输入,直到遇到特定标志 初始化堆:为每个玩家分配一个堆,用于存储扑克牌。 推牌规则:根据游戏规则,对每个堆进行推牌操作,规则包括匹配点数和花色两种方式。 结果输出:统计最终剩余的堆数及其对应的牌数。
发布日期:2021-05-06 16:10:09
浏览次数:21
分类:精选文章
本文共 2972 字,大约阅读时间需要 9 分钟。
代码分析与优化:模拟链表的扑克牌处理
本章的代码使用 vector
类来模拟链表结构,主要用于处理扑克牌的某种游戏规则。以下是代码的主要逻辑分析及优化建议。
代码逻辑概述
代码的核心目标是模拟扑克牌的处理过程,具体包括以下几个步骤:
#
为止。优化建议
代码注释优化
原代码中的一些注释较为简略,建议增加更详细的注释,帮助读者快速理解代码功能。例如:// 读取输入,初始化所有堆// 处理每个堆的推牌规则
函数优化
代码中push
函数的参数命名可以更具体,例如将 x
和 y
改为 from
和 to
,使代码更易理解。 变量命名优化
部分变量名如pile
可能显得过于笼统,建议根据具体用途进行命名,例如: // 将 `pile` 换为更具体的命名,如 `card_pile` 或 `player_piles`
性能优化
在处理大规模数据时,可以考虑优化代码性能。例如,避免在while
循环中频繁调用 size()
和 empty()
方法,而是提前保存结果。 代码风格调整
为了符合技术文档的写作风格,可以适当调整代码的格式。例如:// 避免长长的代码行// 适当分段,使逻辑更清晰
代码示例优化
以下是优化后的代码示例:
#include#include #include #include using namespace std;vector card_piles(52);// 比较两堆牌的匹配情况bool match(const vector & a, const vector & b) { if (!a.empty() && !b.empty()) { string top_a = a.back(); string top_b = b.back(); return top_a[0] == top_b[0] || top_a[1] == top_b[1]; } return false; } void push(vector & from, vector & to) { if (!from.empty() && !to.empty()) { string top_from = from.back(); string top_to = to.back(); from.push_back(to.top()); to.pop(); } } int main() { string s; while (cin >> s && s != "#") { // 重置所有堆 for (int i = 0; i < 52; ++i) { card_piles[i].clear(); } // 初始化第一堆 card_piles[0].push_back(s); // 读取剩余堆并初始化 for (int i = 1; i < 52; ++i) { cin >> s; card_piles[i].push_back(s); } // 处理每个堆的推牌逻辑 for (int i = 1; i < 52; ++i) { if (card_piles[i].empty()) continue; int current = i; bool found = false; while (!found && current > 0) { // 寻找可匹配的上一堆 int pos1 = current; int count = 0; while (count < 3 && pos1 > 0) { if (!card_piles[pos1].empty()) { count++; pos1--; } else { pos1--; } } if (count < 3) { // 寻找可匹配的下一堆 int pos2 = current; while (pos2 > 0 && count < 3) { if (!card_piles[pos2].empty()) { count++; pos2--; } else { pos2--; } } } if (count >= 3) { // 比较匹配情况 if (match(card_piles[pos1], card_piles[current])) { push(card_piles[pos1], card_piles[current]); current = pos1; found = true; } else if (match(card_piles[pos2], card_piles[current])) { push(card_piles[pos2], card_piles[current]); current = pos2; found = true; } else { break; } } else if (count > 0) { // 处理单个或多个匹配 if (match(card_piles[pos2], card_piles[current])) { push(card_piles[pos2], card_piles[current]); current = pos2; found = true; } else { break; } } else { break; } if (found) { if (flag) { // 根据规则设置标志 i = 0; current = i; break; } } } if (!found) { // 标记当前堆需要重置 i = 0; } } // 统计最终剩余堆数 vector remaining; for (int i = 0; i < 52; ++i) { if (!card_piles[i].empty()) { remaining.push_back(card_piles[i].size()); } } if (remaining.size() == 1) { printf("1 pile remaining: 52\n"); } else { printf("%d piles remaining: ", remaining.size()); for (int i = 0; i < remaining.size(); ++i) { printf("%d%c", remaining[i], i == remaining.size() - 1 ? '\n' : ' '); } } } return 0; }
最终优化效果
经过以上优化,代码的结构更加清晰,逻辑更加易于理解。同时,优化后的代码注释更加详细,变量命名更加具象化,代码风格更加符合技术文档的写作规范。
发表评论
最新留言
关注你微信了!
[***.104.42.241]2025年04月05日 02时47分42秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Azure Storage 系列(四)在.Net 上使用Table Storage
2019-03-05
[模板] 带修莫队
2019-03-05
abstract关键字的使用
2019-03-05
算法题:获取一个字符串在另一个字符串中出现的次数
2019-03-05
算法题:获取两个字符串中的最大相同子串
2019-03-05
Asp.Net Core&Jenkins持续交付到Windows Server
2019-03-05
自我总结和学习表单提交的几种方式 (一)
2019-03-05
.NET微信网页开发之使用微信JS-SDK调用微信扫一扫功能
2019-03-05
.NET微信网页开发之使用微信JS-SDK获取当前地理位置
2019-03-05
Android Studio在android Emulator中运行的项目黑屏
2019-03-05
Python写代码的时候为什么要注释?Sun因此被Oracle收购
2019-03-05
JAVA高并发集合详解
2019-03-05
解决Spirng注入时名称下的红色波浪线
2019-03-05
操作系统知识概述
2019-03-05
读懂操作系统(x64)之堆栈帧(过程调用)
2019-03-05
仓储模式到底是不是反模式?
2019-03-05
VS2015安装EF Power Tools
2019-03-05
ASP.NET MVC之JsonResult(六)
2019-03-05