作者:王一哲
日期:2025年3月4日
ZeroJudge 題目連結:
f340. 4.俄羅斯方塊 (Tetris)
解題想法
這題要先寫出各種指令對應的操作,還要檢查方塊是否在邊界使方塊無法旋轉,寫起來很容易出錯。
Python 程式碼
使用時間約為 24 ms,記憶體約為 5.1 MB,通過測試。
def bottom(x, y, d):
if d == 3: return y >= n-1
else: return y+1 >= n-1
def zero(x, y, d):
return x, y+1, d
def one(x, y, d):
if (d in (0, 1, 3) and x+1 < m-1) or (d == 2 and x < m-1): x += 1
return x, y+1, d
def two(x, y, d):
if (d in (1, 2, 3) and x-1 > 0) or (d == 0 and x > 0): x -= 1
return x, y+1, d
def three(x, y, d):
if d == 3: return x, n-1, d
else: return x, n-2, d
def four(x, y, d):
if d == 2 and x == m-1: d = 2
elif d == 0 and x == 0: d = 0
else: d = (d+1)%4
if bottom(x, y, d): return x, y, d
return x, y+1, d
m, n = map(int, input().split())
s = int(input())
arr = list(map(int, input().split()))
if m%2 == 1: x = (m+1)//2 - 1
else: x = m//2 - 1
y = 0
d = 1
for a in arr:
if a == 0: x, y, d = zero(x, y, d)
elif a == 1: x, y, d = one(x, y, d)
elif a == 2: x, y, d = two(x, y, d)
elif a == 3: x, y, d = three(x, y, d); break
else: x, y, d = four(x, y, d)
if bottom(x, y, d): break
grid = [[0]*m for _ in range(n)]
if d == 0:
grid[y-1][x] = grid[y][x] = grid[y+1][x] = grid[y][x+1] = 1
elif d == 1:
grid[y][x-1] = grid[y][x] = grid[y][x+1] = grid[y+1][x] = 1
elif d == 2:
grid[y-1][x] = grid[y][x] = grid[y+1][x] = grid[y][x-1] = 1
else:
grid[y][x-1] = grid[y][x] = grid[y][x+1] = grid[y-1][x] = 1
for g in grid: print(*g, sep='')