概述
本题目比较简单,结合国际象棋的棋局(
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 1≤i≤n≤100 每组字符串有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])
提交结果:
小结
在解决特定问题时,选取合适的数据结构,往往能起到事半功倍的效果。下面回顾一下列表和字典的使用场景。
-
列表的使用场景:
- 存储有序的元素集合,可以随时添加、删除或修改其中的元素。
- 需要对元素进行索引操作,通过索引访问特定位置的元素。
- 需要对元素进行迭代操作,例如循环遍历列表中的每个元素。
- 需要对元素进行排序操作,例如对列表进行升序或降序排序。
- 需要频繁地查找某个元素是否存在于列表中。
- 需要对列表中的元素进行修改、追加或插入等操作。
-
字典的使用场景:
- 存储键值对(key-value pairs),通过键来访问特定的值。
- 需要快速查找某个键对应的值,而不需要关心元素的顺序或位置。
- 需要存储大量的键值对,并且不关心元素的顺序或位置。
- 需要存储非数字的数据类型作为键或值,例如字符串、列表或其他自定义对象。
- 需要使用可变的数据结构来存储键值对,例如在字典中添加、删除或修改键值对。
综上,列表适用于需要存储有序元素集合并且需要对其进行索引、迭代和排序等操作的情况;字典适用于需要存储键值对并且需要快速查找某个键对应的值,而无需关心元素位置的情况。根据实际需求选择合适的数据结构可以提高代码的可读性和效率。