UVa 489 Hangman Judge
题目描述题目要求模拟刽子手游戏并根据给定规则判断每轮游戏的结果。游戏规则如下每轮游戏给出一个单词答案和一系列猜测字母。每次猜测一个字母若该字母在单词中则单词中所有该字母被“翻开”若不在则增加一笔画共需777笔完成。每个错误字母只计一次重复错误不计。若在画完777笔之前猜出所有字母则玩家获胜。若画完777笔仍未猜出所有字母则玩家失败。若猜测序列结束后仍未获胜也未失败则玩家放弃。输入格式输入包含多轮游戏每轮三行第一行一个整数表示轮次编号−1-1−1表示输入结束第二行是答案单词第三行是猜测字母序列可能包含重复字母。所有字母均为小写。输出格式对于每轮游戏输出一行Round X 结果其中X为轮次编号结果为You win.、You lose.或You chickened out.。样例输入1 cheese cheese 2 cheese abcdefg 3 cheese abcdefgij -1输出Round 1 You win. Round 2 You chickened out. Round 3 You lose.题目分析本题的核心是模拟刽子手游戏的过程并判断最终结果。数据结构使用集合all\textit{all}all存储答案单词中的所有不同字母。使用集合right\textit{right}right存储已猜对的字母。使用集合wrong\textit{wrong}wrong存储已猜错的字母去重。模拟过程遍历猜测序列中的每个字母ggg若ggg已经猜过在right\textit{right}right或wrong\textit{wrong}wrong中则跳过重复猜测不影响。若ggg在all\textit{all}all中正确猜测将ggg加入right\textit{right}right。从all\textit{all}all中删除ggg。若all\textit{all}all为空则玩家获胜结束。若ggg不在all\textit{all}all中错误猜测将ggg加入wrong\textit{wrong}wrong。若wrong\textit{wrong}wrong的大小达到777则玩家失败结束。若遍历完所有猜测后仍未获胜或失败则玩家放弃。复杂度分析每轮游戏处理O(猜测长度答案长度)O(\text{猜测长度} \text{答案长度})O(猜测长度答案长度)完全可接受。代码实现// Hangman Judge// UVa ID: 489// Verdict: Accepted// Submission Date: 2016-07-14// UVa Run Time: 0.580s//// 版权所有C2016邱秋。metaphysis # yeah dot net#includebits/stdc.husingnamespacestd;intmain(intargc,char*argv[]){ios::sync_with_stdio(false);intround;string solution,guess;while(cinround,round!-1){coutRound roundendl;cinsolutionguess;boolflagfalse;setcharright,wrong,all;for(inti0;isolution.length();i)all.insert(solution[i]);for(inti0;iguess.length();i){if(right.find(guess[i])!right.end())continue;if(all.find(guess[i])all.end()){wrong.insert(guess[i]);if(wrong.size()7){coutYou lose.endl;flagtrue;break;}}else{right.insert(guess[i]);all.erase(guess[i]);if(all.size()0){coutYou win.endl;flagtrue;break;}}}if(!flag)coutYou chickened out.endl;}return0;}