当前位置: 代码迷 >> 综合 >> python实现 CCF201604-2 俄罗斯方块
  详细解决方案

python实现 CCF201604-2 俄罗斯方块

热度:96   发布时间:2023-10-23 04:29:58.0
试题编号: 201604-2
试题名称: 俄罗斯方块
时间限制: 1.0s
内存限制: 256.0MB
问题描述:

问题描述

  俄罗斯方块是俄罗斯人阿列克谢·帕基特诺夫发明的一款休闲游戏。
  游戏在一个15行10列的方格图上进行,方格图上的每一个格子可能已经放置了方块,或者没有放置方块。每一轮,都会有一个新的由4个小方块组成的板块从方格图的上方落下,玩家可以操作板块左右移动放到合适的位置,当板块中某一个方块的下边缘与方格图上的方块上边缘重合或者达到下边界时,板块不再移动,如果此时方格图的某一行全放满了方块,则该行被消除并得分。
  在这个问题中,你需要写一个程序来模拟板块下落,你不需要处理玩家的操作,也不需要处理消行和得分。
  具体的,给定一个初始的方格图,以及一个板块的形状和它下落的初始位置,你要给出最终的方格图。

输入格式

  输入的前15行包含初始的方格图,每行包含10个数字,相邻的数字用空格分隔。如果一个数字是0,表示对应的方格中没有方块,如果数字是1,则表示初始的时候有方块。输入保证前4行中的数字都是0。
  输入的第16至第19行包含新加入的板块的形状,每行包含4个数字,组成了板块图案,同样0表示没方块,1表示有方块。输入保证板块的图案中正好包含4个方块,且4个方块是连在一起的(准确的说,4个方块是四连通的,即给定的板块是俄罗斯方块的标准板块)。
  第20行包含一个1到7之间的整数,表示板块图案最左边开始的时候是在方格图的哪一列中。注意,这里的板块图案指的是16至19行所输入的板块图案,如果板块图案的最左边一列全是0,则它的左边和实际所表示的板块的左边是不一致的(见样例)

输出格式

  输出15行,每行10个数字,相邻的数字之间用一个空格分隔,表示板块下落后的方格图。注意,你不需要处理最终的消行。

样例输入

0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 1 0 0 0
1 1 1 0 0 0 1 1 1 1
0 0 0 0 1 0 0 0 0 0
0 0 0 0
0 1 1 1
0 0 0 1
0 0 0 0
3

样例输出

0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 1 0 0 0
1 1 1 1 1 1 1 1 1 1
0 0 0 0 1 1 0 0 0 0

一、解题思路分析

(一)90分的思路

1.读取方块、版块的数据,并且用tag标记出版块首次出现1的行数(从底往上看)

2.遍历方块的每行,若版块中的tag行+方块的第i+1行==2,则重叠位置end=i-1(end默认值为14)

3.这方法的第二部有问题,有可能版块中的tag行 + 方块的第i+1  != 2,如下:

python实现 CCF201604-2 俄罗斯方块python实现 CCF201604-2 俄罗斯方块python实现 CCF201604-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])))

 

  相关解决方案