2026/1/10 2:38:51
网站建设
项目流程
网站制作公司咨询网站制作公司,wordpress post编辑,搜索推广 外贸,如何做网站相册石头剪刀布游戏 2025华为OD机试双机位B卷 - 华为OD上机考试双机位B卷 100分题型 华为OD机试双机位B卷真题目录点击查看: 华为OD机试双机位B卷真题题库目录#xff5c;机考题库 算法考点详解
题目描述
石头剪刀布游戏有 3 种出拳形状#xff1a;石头、剪刀、布。分别用字母…石头剪刀布游戏2025华为OD机试双机位B卷 - 华为OD上机考试双机位B卷 100分题型华为OD机试双机位B卷真题目录点击查看: 华为OD机试双机位B卷真题题库目录机考题库 算法考点详解题目描述石头剪刀布游戏有 3 种出拳形状石头、剪刀、布。分别用字母A、B、C表示。游戏规则出拳形状之间的胜负规则如下A BB CC A“” 左边一个字母表示相对优势形状。右边一个字母表示相对劣势形状。当本场次中有且仅有一种出拳形状优于其他出拳形状则该形状的玩家是胜利者。否则认为是平局。例如1三个玩家出拳分别是ABC。由于三方优势循环即没有任何一方优于其他出拳者判断为平局。例如2三个玩家出拳分别是ABB。出拳A的获胜。例如3三个玩家出拳全部是A。判为平局。当发生平局没有赢家。有多个胜利者时同为赢家。输入描述在一场游戏中每个玩家的信息为一行。玩家数量不超过1000。每个玩家信息有2个字段用空格隔开玩家ID一个仅由英文字母和数字组成的字符串出拳形状以英文大写字母表示A、B、C形状。例如:abc1 Axyz B解释玩家abc1出拳为石头A。玩家xyz出拳为剪刀B输出描述输出为赢家的玩家ID列表一个或多个每个ID一行按字符串升序排列。如果没有赢家输出为”NULL“字符串。例如:abc1用例1输入abc1 A xyz B输出abc1说明A比B有优势abc1胜出用例2输入abc1 A xyz A输出NULL说明没有优胜的出拳形状平局用例3输入abc1 A def A alic A xyz B输出abc1 alic def说明A为优胜方有三个赢家题解思路逻辑分析可以使用哈希表 / 二维数组存储各个手型的用户名称。接下来分情况讨论得出结果如果只出现一种手型 或者三种手型说明是平局则直接输出NULL结束。出现两种手型的话肯定有胜者接下来分以下情况如果没有出现A,代表出现B C, 那么出B的就是胜者如果没有出现B,代表出现A C, 那么出C的就是胜者如果没有出现C,代表出现A B, 那么出A的就是胜者如果存在胜者的话将用户名按照字典序升序排序之后输出结果即可。c#includeiostream #includevector #includestring #include utility #include sstream #includealgorithm #includecmath #includemap using namespace std; // 通用 切割函数 函数 将字符串str根据delimiter进行切割 vectorstring split(const string str, const string delimiter) { vectorstring result; size_t start 0; size_t end str.find(delimiter); while (end ! string::npos) { result.push_back(str.substr(start, end - start)); start end delimiter.length(); end str.find(delimiter, start); } // 添加最后一个部分 result.push_back(str.substr(start)); return result; } int main() { // 存储每个手型的名字 mapstring, vectorstring mapping; string input; while (getline(cin, input)) { if (input.empty()) { break; } vectorstring tmp split(input, ); mapping[tmp[1]].push_back(tmp[0]); } // 三个手型或者一个手型都是平局 if (mapping.size() 3 || mapping.size() 1) { cout NULL; return 0; } vectorstring res; // 没有石头只有 剪刀/布 剪刀赢 if (mapping[A].empty()) { res mapping[B]; // 没有剪刀只有 石头/布 布赢 } else if (mapping[B].empty()) { res mapping[C]; // 没有布 只有剪刀/石头 石头赢 } else { res mapping[A]; } // 升序 sort(res.begin(), res.end()); // 输出结果 for (int i 0; i res.size(); i) { cout res[i] endl; } return 0; }JAVAimport java.io.*; import java.util.*; public class Main { public static void main(String[] args) throws Exception { BufferedReader br new BufferedReader(new InputStreamReader(System.in)); // 存储每个手型对应的玩家名字 MapString, ListString mapping new HashMap(); String line; while ((line br.readLine()) ! null) { if (line.trim().isEmpty()) { break; } String[] arr line.split( ); String name arr[0]; String type arr[1]; mapping.putIfAbsent(type, new ArrayList()); mapping.get(type).add(name); } // 三种手型或只有一种手型都是平局 if (mapping.size() 3 || mapping.size() 1) { System.out.print(NULL); return; } ListString res; // 没有石头(A)只有剪刀(B)/布(C)剪刀赢 if (!mapping.containsKey(A)) { res mapping.get(B); } // 没有剪刀(B)只有石头(A)/布(C)布赢 else if (!mapping.containsKey(B)) { res mapping.get(C); } // 没有布(C)只有石头(A)/剪刀(B)石头赢 else { res mapping.get(A); } // 按名字升序输出 Collections.sort(res); for (String s : res) { System.out.println(s); } } }Pythonimportsysfromcollectionsimportdefaultdict# 存储每个手型对应的玩家名字mappingdefaultdict(list)# 读取输入直到遇到空行或 EOFforlineinsys.stdin:lineline.strip()ifnotline:breakname,handline.split()mapping[hand].append(name)# 三种手型或只有一种手型都是平局iflen(mapping)3orlen(mapping)1:print(NULL)sys.exit(0)# 判断胜者# 没有石头(A)剪刀(B)赢ifAnotinmapping:resmapping[B]# 没有剪刀(B)布(C)赢elifBnotinmapping:resmapping[C]# 没有布(C)石头(A)赢else:resmapping[A]# 升序输出res.sort()fornameinres:print(name)JavaScriptconstreadlinerequire(readline);// readline 接收输入constrlreadline.createInterface({input:process.stdin,output:process.stdout});constlines[];rl.on(line,line{lines.push(line.trim());});rl.on(close,(){// 存储每个手型对应的玩家名字constmappingnewMap();for(constlineoflines){if(line)break;const[name,hand]line.split( );if(!mapping.has(hand)){mapping.set(hand,[]);}mapping.get(hand).push(name);}// 三种手型或只有一种手型都是平局if(mapping.size3||mapping.size1){console.log(NULL);return;}letres;// 没有石头(A)剪刀(B)赢if(!mapping.has(A)){resmapping.get(B);}// 没有剪刀(B)布(C)赢elseif(!mapping.has(B)){resmapping.get(C);}// 没有布(C)石头(A)赢else{resmapping.get(A);}// 按字典序升序res.sort();// 输出结果for(constnameofres){console.log(name);}});Gopackagemainimport(bufiofmtossortstrings)funcmain(){in:bufio.NewScanner(os.Stdin)// 存储每个手型对应的玩家名字mapping:make(map[string][]string)// 逐行读取输入forin.Scan(){line:strings.TrimSpace(in.Text())ifline{break}parts:strings.Split(line, )name:parts[0]hand:parts[1]mapping[hand]append(mapping[hand],name)}// 三种手型或只有一种手型都是平局iflen(mapping)3||len(mapping)1{fmt.Print(NULL)return}varres[]string// 没有石头(A)剪刀(B)赢if_,ok:mapping[A];!ok{resmapping[B]}elseif_,ok:mapping[B];!ok{// 没有剪刀(B)布(C)赢resmapping[C]}else{// 没有布(C)石头(A)赢resmapping[A]}// 升序排序sort.Strings(res)// 输出结果for_,name:rangeres{fmt.Println(name)}}