试题编号: | 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 |
问题链接:CCF201604-2 俄罗斯方块
问题分析
分别找到原始方块布局中第n列到n+4列最上面的元素距顶部的位置。在找到掉落方块的距底部的位置。
两个位置相加最小者即为掉落方块最多可以下降几个格子的距离
最后将掉落方块中的1填入到原始方块中即可
但是很遗憾,根据思路写出来的程序没有得100分,只得了90分。希望发现我程序bug的同学能在评论区留言。(文末附上满分的c++代码)
不是满分的程序
#首先将输入的方块存入二维数组中
block=[]
for i in range(15):
s=input().split()
for j in range(10):
s[j]=int(s[j])
block+=[s]
#存储下降的方块和下降的位置
#同时找到下降方块最底部的元素距离底部的位置
down_b=[]
button=[4,4,4,4]
for i in range(4):
s=input().split()
for j in range(4):
s[j]=int(s[j])
#找到方块最下面的元素位置i
if s[j]==1:
button[j]=3-i
down_b+=[s]
#将位置数减一
position=int(input())-1
#因为已经知道了下沉方块的最下面的元素位置,那么就可以求出来方块能下降的最大深度是多少
#意思就是最下端接触到1的时候就不能再往下了
#找到block的position列到position+3列最上面的元素距离最上面有几行
head=[15,15,15,15]
for i in range(position,position+4):
for j in range(0,15):
if block[j][i]==1:
head[i-position]=j
break
#求出能下降的最大深度
max_deep=20
for i in range(4):
if (head[i]+button[i])<max_deep:
max_deep=head[i]+button[i]
#将下沉方块填入到block中
for i in range(max_deep-4,max_deep):
for j in range(position,position+4):
#只把down_b中为1的地方填到block中,0不填
if down_b[i-max_deep+4][j-position]==1:
block[i][j]=down_b[i-max_deep+4][j-position]
#格式化输出最后的block
for i in range(15):
print(block[i][0],end='')
for j in range(1,10):
print('',block[i][j],end='')
print()