L1-044 稳赢(15分)
题目信息
| 项目 | 内容 |
|---|---|
| 题目编号 | L1-044 |
| 题目名称 | 稳赢 |
| 分数 | 15分 |
| 作者 | 陈越 |
| 单位 | 浙江大学 |
题目描述
大家应该都会玩"锤子剪刀布"的游戏:两人同时给出手势,胜负规则如下:
- 锤子(ChuiZi) 赢 剪刀(JianDao)
- 剪刀(JianDao) 赢 布(Bu)
- 布(Bu) 赢 锤子(ChuiZi)
现要求你编写一个稳赢不输的程序,根据对方的出招,给出对应的赢招。但是!为了不让对方输得太惨,你需要每隔K次就让一个平局。
解题思路
本题需要模拟"锤子剪刀布"游戏,并按照规则输出稳赢的招式,同时每隔K次输出一个平局。
核心逻辑:
- 建立手势之间的胜负关系映射
- 维护当前计数器和平局间隔K
- 当计数器达到K时,输出平局(即与对方相同的手势),并重置计数器
- 否则输出稳赢的手势(克制对方的手势)
克制关系:
- 对方出锤子 → 我出布(布赢锤子)
- 对方出剪刀 → 我出锤子(锤子赢剪刀)
- 对方出布 → 我出剪刀(剪刀赢布)
Java实现
import java.util.*; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int K = scanner.nextInt(); // 平局间隔次数 // 记录已经输出的次数(不含平局) int count = 0; while (scanner.hasNext()) { String input = scanner.next(); if (input.equals("End")) { break; } count++; if (count % (K + 1) == 0) { // 平局:输出与对方相同的手势 System.out.println(input); } else { // 输出稳赢的手势 System.out.println(getWinGesture(input)); } } scanner.close(); } // 获取克制对方手势的稳赢手势 private static String getWinGesture(String opponent) { switch (opponent) { case "ChuiZi": return "Bu"; // 布赢锤子 case "JianDao": return "ChuiZi"; // 锤子赢剪刀 case "Bu": return "JianDao"; // 剪刀赢布 default: return ""; } } }Python实现
def main(): K = int(input()) # 平局间隔次数 count = 0 # 手势克制关系:对方手势 -> 稳赢手势 win_map = { 'ChuiZi': 'Bu', # 布赢锤子 'JianDao': 'ChuiZi', # 锤子赢剪刀 'Bu': 'JianDao' # 剪刀赢布 } while True: gesture = input() if gesture == 'End': break count += 1 if count % (K + 1) == 0: # 平局:输出与对方相同的手势 print(gesture) else: # 输出稳赢的手势 print(win_map[gesture]) if __name__ == '__main__': main()运行验证
输入:
2 ChuiZi JianDao Bu JianDao Bu ChuiZi ChuiZi EndJava输出:
Bu ChuiZi Bu JianDao JianDao ChuiZi BuPython输出:
Bu ChuiZi Bu JianDao JianDao ChuiZi Bu复杂度分析
- 时间复杂度:O(N),其中N为输入的出招次数
- 空间复杂度:O(1),只使用常数级别的额外空间
总结
本题是一道简单的模拟题,关键点在于:
- 正确理解克制关系并建立映射
- 理解每隔K次平局的规则(即每K+1次输出一次平局)
- 边界情况处理:平局时输出与对方相同的手势
