CCF CSP认证 20230501 重复局面 满分题解 Python实现

概述

  本题目比较简单,结合国际象棋的棋局( 8 × 8 8\times 8 8×8),主要考察的是关于字符串处理与比较、循环、输入输出的运用。题目版权归CCF所有,真题跳转官网查看
  真题来源:重复局面
  官网地址:www.cspro.org(模拟考试入口)

题目分析

  输入 n 组字符串,将第 i 组字符串依次与前 i-1 组字符串进行比较,其中 1 ≤ i ≤ n ≤ 100 1 \leq i \leq n \leq 100 1in100 每组字符串有8行8列共64个字符,输出第 i 组字符串出现的次数。

满分题解

方法一(用列表统计)

  • 第一步,接受总的步数 n 。利用*** eval()或int()***函数去除字符串的引号。若 n > 0 n> 0 n>0,则执行以下步骤,否则什么也不做。
  • 第二步,接受棋局,共 n × 8 n\times 8 n×8 行输入。按 每8行 为一段将字符串拼接,添加到局面列表str_li中。
  • 第三步,对棋局进行分析。由于第1步的局面,一定是首次出现,可直接创建出现次数列表 num[1]局面列表的第二个元素开始依次遍历,记当前元素为 i默认出现次数t=1,然后同前i-1个元素进行比较,若相同,则 t + 1 t+1 t+1
  • 第四步,遍历出现次数列表num,输出每个局面已出现的次数。
具体实现:
def solution1(n):
    str_li = []		# 局面列表
    for i in range(n*8):
        site = int(i/8)		# 每8行为一组
        if site % 8 == 0: 	# 要有第i组的字符串
          str_li.append("")
        str_li[site] += input()		# 拼接
    num = [1]
    for i in range(1, n):		# 遍历第2步到第n步棋局
        t = 1
        now = str_li[i]
        for item in str_li[0:i]:	# 第i个和前i-1个进行比较
            if item == now:
                t += 1
        num.append(t)		# 记录每一个局面是第几次出现的
    for u in num:		# 按格式输出
        print(u)


if __name__ == "__main__":
    n = eval(input())
    if n > 0:
        solution1(n)

提交结果:

请添加图片描述

方法二(用字典统计)

  • 第一步,接受总的步数 n 。利用*** eval() 或 int()函数去除字符串的引号,在实际的企业编程中处理input推荐使用int()*。结合range()方法的使用效果,可以不用对n进行判断,例如:range(-5),就是range(0,-5),它的迭代对象个数是0。
  • 第二步,建立棋局字典。棋局字典 chess 将每一步的棋局(8行字符串)在拼接后作为键,共n个键。 若键不存在,则值设为1;若存在,则值+1。
  • 第三步,输出当前键对应的值。
具体实现:
n = int(input())
chess = {}		# 棋局字典
for i in range(n):
    tmp = ''
    for j in range(8):		# 拼接第i步的棋局
        tmp += input()
    if tmp not in chess:	# 该步棋局不曾出现
        chess[tmp] = 1		# 初始值1
    else:
        chess[tmp] += 1		# 相同棋局又出现
    print(chess[tmp])
 
提交结果:

请添加图片描述

小结

  在解决特定问题时,选取合适的数据结构,往往能起到事半功倍的效果。下面回顾一下列表和字典的使用场景。

  1. 列表的使用场景:

    • 存储有序的元素集合,可以随时添加、删除或修改其中的元素。
    • 需要对元素进行索引操作,通过索引访问特定位置的元素。
    • 需要对元素进行迭代操作,例如循环遍历列表中的每个元素。
    • 需要对元素进行排序操作,例如对列表进行升序或降序排序。
    • 需要频繁地查找某个元素是否存在于列表中。
    • 需要对列表中的元素进行修改、追加或插入等操作。
  2. 字典的使用场景:

    • 存储键值对(key-value pairs),通过键来访问特定的值。
    • 需要快速查找某个键对应的值,而不需要关心元素的顺序或位置。
    • 需要存储大量的键值对,并且不关心元素的顺序或位置。
    • 需要存储非数字的数据类型作为键或值,例如字符串、列表或其他自定义对象。
    • 需要使用可变的数据结构来存储键值对,例如在字典中添加、删除或修改键值对。

  综上,列表适用于需要存储有序元素集合并且需要对其进行索引、迭代和排序等操作的情况;字典适用于需要存储键值对并且需要快速查找某个键对应的值,而无需关心元素位置的情况。根据实际需求选择合适的数据结构可以提高代码的可读性和效率。

  • 24
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值