2026/4/6 5:44:31
网站建设
项目流程
网站建设难度大吗,用vps安装Wordpress,wordpress交易平台主题,医院官方网站建设题目分析与解题思路
本题要求模拟“手风琴”接龙游戏的进行过程。游戏规则如下#xff1a;
将一副 525252 张牌从左到右依次发牌#xff0c;每张牌成为一个牌堆。任何时候#xff0c;若某张牌与其左边相邻牌堆的最上方一张牌匹配#xff08;花色相同或点数相同#xff0…题目分析与解题思路本题要求模拟“手风琴”接龙游戏的进行过程。游戏规则如下将一副52 5252张牌从左到右依次发牌每张牌成为一个牌堆。任何时候若某张牌与其左边相邻牌堆的最上方一张牌匹配花色相同或点数相同或与其左边第三堆的最上方一张牌匹配则可以将其移动到匹配的牌堆上。移动后如果出现空堆立即将所有右侧牌堆左移填充空隙。当有多种可能的移动时优先移动最左边可以移动的牌若一张牌既可以左移一单位也可以左移三单位则选择移动三单位。游戏结束条件为无法再移动任何牌目标是尽可能合并牌堆最终可能只剩一个牌堆获胜。问题理解由于移动操作会影响后续移动的可能性而且移动顺序和选择策略影响最终结果因此需要严格按照题目描述的规则进行模拟。关键在于如何高效实现移动、合并和空堆压缩。数据结构选择使用vectorvectorstring piles存储所有牌堆每个牌堆是一个string的向量底部为最早发的牌顶部为最后发的牌即最上方的一张。由于需要频繁访问每个牌堆的顶部牌以及可能需要删除空牌堆和插入新牌使用vector可以提供较好的随机访问和尾部操作性能。算法流程发牌每次读取两行每行26 2626张牌每张牌作为一个单独的牌堆加入piles中。游戏循环每次移动前先清除所有空堆即piles[i].size() 0的堆。从最左边的牌堆开始向右检查对于每个牌堆先判断是否能向左移动三格如果左边第三堆存在且匹配若可以则移动并更新索引否则判断是否能向左移动一格若可以则移动否则继续向右检查。移动后将当前牌堆的顶部牌移动到目标牌堆的顶部即push_back并删除原牌堆的顶部牌即pop_back或erase。循环直到一次完整扫描中没有发生任何移动游戏结束。输出输出剩余牌堆的数量及各堆的牌数。移动策略由于要求移动最左边可能的牌并且优先移动三格因此在检查每个牌堆时先判断能否移动三格再判断能否移动一格。移动后索引回退到目标堆的位置继续从该位置向左检查可能的移动这是因为移动可能导致新的匹配机会。时间复杂度最坏情况下每张牌可能需要多次移动每次移动可能需要遍历整个牌堆列表。由于牌的总数是固定的52 5252张且每次移动至少减少一个牌堆合并或删除空堆因此操作次数有限实际运行时间可接受。注意事项输入以#开头的一行结束。输出格式剩余牌堆数 pile(s) remaining: 各堆牌数。注意空堆的及时清除。参考代码// Accordian Patience// UVa ID: 127// Verdict: Accepted// Submission Date: 2015-11-28// UVa Run Time: 1.159s//// 版权所有C2015邱秋。metaphysis # yeah dot net#includebits/stdc.husingnamespacestd;vectorvectorstringpiles;voidprint(){coutpiles.size();cout(piles.size()1? piles: pile) remaining:;for(inti0;ipiles.size();i)cout piles[i].size();coutendl;}voidgetCards(string line){istringstreamiss(line);string card;while(isscard){vectorstringpile;pile.push_back(card);piles.push_back(pile);}}boolcanMoveToLeft(intindex){return(index0(piles[index].back()[0]piles[index-1].back()[0]||piles[index].back()[1]piles[index-1].back()[1]));}boolcanMoveToThirdLeft(intindex){return(index2(piles[index].back()[0]piles[index-3].back()[0]||piles[index].back()[1]piles[index-3].back()[1]));}voidplay(){while(true){for(intipiles.size()-1;i0;i--)if(piles[i].size()0)piles.erase(piles.begin()i);intindex0;boolmovedfalse;while(index0indexpiles.size()){if(piles[index].size()0)break;if(canMoveToThirdLeft(index)){piles[index-3].push_back(piles[index].back());piles[index].erase(piles[index].end());index-3;movedtrue;continue;}if(canMoveToLeft(index)){piles[index-1].push_back(piles[index].back());piles[index].erase(piles[index].end());index-1;movedtrue;continue;}index;}if(!moved)break;}}intmain(intargc,char*argv[]){string line1,line2;while(true){piles.clear();getline(cin,line1);if(line1.front()#)break;getCards(line1);getline(cin,line2);getCards(line2);play();print();}return0;}