开心是天下最可爱的小猫 2023-01-07 21:47 采纳率: 100%
浏览 51
已结题

猜数字游戏用python怎么解决

一.题目描述
实现一个经典"猜数字"游戏。
给定答案序列和用户猜的序列,统计有多少数字位置正确(A),有多少数字在两个序列都出现过但位置不对(B)。
输入包含多组数据。
每组输入第一行为序列长度n,第二行是答案序列,接下来是若干猜测序列。
猜测序列全0时该组数据结束。n=0时输入结束。
二.示例
样例输入:
4
1 3 5 5
1 1 2 3
4 3 3 5
6 5 5 1
6 1 3 5
1 3 5 5
0 0 0 0
10
1 2 2 2 4 5 6 6 6 9
1 2 3 4 5 6 7 8 9 1
1 1 2 2 3 3 4 4 5 5
1 2 1 3 1 5 1 6 1 9
1 2 2 5 5 5 6 6 6 7
0 0 0 0 0 0 0 0 0 0
0
样例输出:
(1,1)
(2,0)
(1,2)
(1,2)
(4,0)

(2,4)
(3,2)
(5,0)
(7,0)
解释:
输入:
第一行,数字表示答案是多少个数字组成的序列。第二行为答案序列。接下来每一行为猜测的序列。
输出:
接下来每一行括号内左边的数表示猜测序列中位置和值都猜对的个数(A),右边的数表示仅猜对值的个数(B)。
我的代码如下:

n = int(input())
l = []
while n != 0:
    daan = [int(x) for x in input().split(' ')]
    caice = [int(x) for x in input().split(' ')]
    while any(caice):
        a = 0
        b = 0
        for v in range(0, n):  # 除第一次,剩下的不会进行比较
            if daan[v] == caice[v]:
                a += 1
        for i in range(1, 10):
            m = 0
            n = 0
            for j in range(0, n):  # 完全没有进入此循环
                if daan[j] == i:
                    m += 1
                if caice[j] == i:
                    n += 1
            if m < n:
                b += m
            else:
                b += n
        l.append([a, b - a])
        caice = [int(x) for x in input().split(' ')]
    n = int(input())
for i in l:
    print('(%d,%d)' % (i[0], i[1]))

但我的结果:

img


刚学python没多久,基本上是自己摸索,不太明白为什么会出现这样的问题,万分感谢各位解答

  • 写回答

2条回答 默认 最新

  • hsu8999 2023-01-07 22:02
    关注

    首先我们需要分析一下题意:

    输入包含多组数据,每一组数据的第一行是序列的长度 n
    第二行是答案序列
    后面的行是猜测的序列,0 0 0 0 为猜测序列结束
    n=0 时输入结束
    那么我们可以使用循环语句实现对每一组数据的处理。

    对于每一组数据,我们需要先读入 n 和答案序列,然后读入猜测序列,对每一个猜测序列,我们把与答案序列相同的数的个数统计出来,然后再统计与答案序列值相同但位置不同的数的个数。我们可以使用变量 A 和 B 分别记录猜测序列中位置和值都猜对的个数(A),仅猜对值的个数(B)。

    在统计猜测序列与答案序列相同的数的个数时,我们可以使用 for 循环,枚举猜测序列的每一位,如果值相同,就将 A 的值加 1。

    在统计猜测序列与答案序列值相同但位置不同的数的个数时,我们可以使用两个 for 循环,枚举猜测序列的每一位和答案序列的每一位,如果值相同且位置不同,就将 B 的值加 1。

    下面是完整的代码:

    while True:
        # 读入 n
        n = int(input())
        if n == 0:
            break
        # 读入答案序列
        ans = list(map(int, input().split()))
        # 读入猜测序列
        while True:
            guess = list(map(int, input().split()))
            if guess == [0] * n:
                break
            # 记录 A 和 B 的值
            A = 0
            B = 0
            # 统计 A 的值
            for i in range(n):
                if ans[i] == guess[i]:
                    A += 1
            # 统计 B 的值
            for i in range(n):
                for j in range(n):
                    if ans[i] == guess[j] and i != j:
                        B += 1
            # 输出结果
            print(f'({A},{B})')
    

    注意,在统计 B 的值时,我们需要判断 i 与 j 的位置是否相同,如果相同就不能统计。

    上述代码可以通过示例数据进行测试。
    另外,在统计 B 的值时,我们还可以使用一种不同的方法,即使用两个字典分别记录答案序列和猜测序列中每个数字的出现次数,然后遍历字典,对于答案序列和猜测序列中出现过的每个数字,取出答案序列字典中的值和猜测序列字典中的值的最小值,累加到 B 中。

    下面是使用这种方法的代码:

    while True:
        # 读入 n
        n = int(input())
        if n == 0:
            break
        # 读入答案序列
        ans = list(map(int, input().split()))
        # 读入猜测序列
        while True:
            guess = list(map(int, input().split()))
            if guess == [0] * n:
                break
            # 记录 A 和 B 的值
            A = 0
            B = 0
            # 统计 A 的值
            for i in range(n):
                if ans[i] == guess[i]:
                    A += 1
            # 统计 B 的值
            ans_dict = {}
            guess_dict = {}
            for i in range(n):
                if ans[i] not in ans_dict:
                    ans_dict[ans[i]] = 1
                else:
                    ans_dict[ans[i]] += 1
                if guess[i] not in guess_dict:
                    guess_dict[guess[i]] = 1
                else:
                    guess_dict[guess[i]] += 1
            for num in ans_dict:
                if num in guess_dict:
                    B += min(ans_dict[num], guess_dict[num])
            # 输出结果
            print(f'({A},{B})')
    

    同样,上述代码可以通过示例数据进行测试。

    希望这个回答能帮到你!如果你还有其他问题,请随时追问。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 1月16日
  • 已采纳回答 1月8日
  • 创建了问题 1月7日

悬赏问题

  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来