当前位置: 代码迷 >> 综合 >> CCF 201604-2 俄罗斯方块 Python满分代码
  详细解决方案

CCF 201604-2 俄罗斯方块 Python满分代码

热度:10   发布时间:2023-12-14 11:39:11.0

CCF CSP 俄罗斯方块 Python满分代码

1. 题目
在这里插入图片描述

2. 解题思想
利用两个列表来记录方块的位置,第一个列表Mid记录方块边缘位置的坐标,第二个out数组记录所有方块元素的位置,通过Mid向下比较,确定最终的位置,然后移动out列表中对应位置的元素,实现下落。

  • 注意:CSP python代码好像不支持import numpy,提交代码后,提示运行错误。

3. Python代码

# -*- ecoding: utf-8 -*-
# @ModuleName: CSP201512-2
# @Function: 
# @Author: ZhangMing
# @Time: 2020/10/13 19:53
# 接收数据
A = []
for _ in range(15):temp = list(map(int, input().split()))A.append(temp)B = []
for _ in range(4):B.append(list(map(int, input().split())))
n = int(input())# 计算 方块从下往上 行全部为 0的个数
count1 = 0
for j in range(3, -1, -1):if len(set(B[j])) == 1 and 0 in set(B[j]):count1 += 1else:break# 找出边缘位置的坐标 用于下落运动时比较
Mid0 = [-1, -1, -1, -1]
for i in range(4):for j in range(4):if B[i][j] == 1:Mid0[j] = iMid = []
for i in range(len(Mid0)):if Mid0[i] != -1:Mid.append((Mid0[i], i + n-1))# 将方块放入 方格中for i in range(4):for j in range(4):A[i][n-1+j] = B[i][j]# 找出所有元素的位置 最后确定位置时移动使用
out = []
for i in range(4):for j in range(10):if A[i][j] == 1:out.append((i, j))# 向下比较
flag = True
row = 1+count1
while flag:for x in Mid:if A[x[0]+row][x[1]] == 1:flag = Falseif flag:row += 1if row > 11+count1:flag = False
row -= 1# 移动元素 为防止覆盖 先最下边一行开始移动
out.sort(reverse=True)
if row != 0:for X in out:A[X[0] + row][X[1]] = 1A[X[0]][X[1]] = 0# 输出
for i in range(15):print(' '.join(list(map(str, A[i]))))

4. 运行结果
在这里插入图片描述

  相关解决方案