试题编号: | 201604-2 |
试题名称: | 俄罗斯方块 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 俄罗斯方块是俄罗斯人阿列克谢·帕基特诺夫发明的一款休闲游戏。 输入格式 输入的前15行包含初始的方格图,每行包含10个数字,相邻的数字用空格分隔。如果一个数字是0,表示对应的方格中没有方块,如果数字是1,则表示初始的时候有方块。输入保证前4行中的数字都是0。 输出格式 输出15行,每行10个数字,相邻的数字之间用一个空格分隔,表示板块下落后的方格图。注意,你不需要处理最终的消行。 样例输入 0 0 0 0 0 0 0 0 0 0 样例输出 0 0 0 0 0 0 0 0 0 0 |
一、解题思路分析
(一)90分的思路
1.读取方块、版块的数据,并且用tag标记出版块首次出现1的行数(从底往上看)
2.遍历方块的每行,若版块中的tag行+方块的第i+1行==2,则重叠位置end=i-1(end默认值为14)
3.这方法的第二部有问题,有可能版块中的tag行 + 方块的第i+1 != 2,如下:
图1 原始方块 图2 版块以及位置 图3 更新后的值
(二)100分思想
1.第一步与90分思想中的第一步一致
2.遍历方块的每行,若版块若版块中的index行+方块的第i+1行==2,则重叠位置end=i-1+(tag-index) (end默认值为14),其中方块中的每行,index取值范围为:[tag, 0]
二、满分代码
org = []
for i in range(15): # 15 * 10的方块数据temp = list(map(int, input().split()))org.append(temp)ele = [] # 4 * 4版块数据
for i in range(4):temp = list(map(int, input().split()))ele.append(temp)tag = 3 # 标记4*4版块,非零的行数
b1 = 1 in ele[3]
b2 = 1 in ele[2]
b3 = 1 in ele[1]
if not b1 and not b2 and not b3:tag = 0 # 非零数据出现在第一行
elif not b1 and not b2 and b3:tag = 1
elif not b1 and b2:tag = 2col = int(input()) - 1 # 列表的下标从1开始,所以需要-1
flag = False # 标记方块和版块是否重叠,即2个矩阵之和是否出现2
end = 14 # 记录重叠出现的位置,默认是14
for i in range(4, 15):temp = org[i][col:col+4] # 方块中第i+1行对应的数据index = tag# 这里十分注意,要将方块的第i+1行数据与版块中ele[:tag]数据所有相加while index >= 0: for m, n in zip(temp, ele[index]):if m + n >= 2:flag = Truebreakif flag == True:breakindex -= 1if flag == True:end = i - 1 + (tag-index) # 注意end的取值breakfor i in range(tag, -1, -1):a = org[end][col:col+4]b = ele[i]index = colfor m, n in zip(a, b):org[end][index] = m+nindex += 1end -= 1
# 打印结果
for i in range(15):print(" ".join(map(str, org[i])))