유사 테트리스인데 이제 행과 열 둘 다로 움직인다.
그림에서와 같이 빨간칸에 블럭이 생기면 아래에 있는 초록칸과 오른쪽에 있는 파란칸으로 블럭이 이동하게 된다.
이동한 블럭들로 인해서 초록칸의 경우 하나의 행이, 파란칸의 경우 하나의 열이 블럭으로 차게 될 경우 테트리스처럼 한 행, 한 열이 사라지게 된다. 하나의 행과 하나의 열이 사라질 때마다 각각 1점씩 획득한다.
2차원 배열을 다룰 때는 열을 삭제하는 것보다는 행을 삭제하는 게 편하기 때문에 파란칸을 90도 회전시켜서 초록칸의 형태로 만들어서 구현했다. 빨간칸에서 블럭이 이동할 때 초록칸과 파란칸에 각각 행, 열의 값을 반대로 넘겨주면 된다.
# 도노미노도미노 2
def block_one(arr, col):
row = 0
while row < 6:
if arr[row][col] == 1:
break
row += 1
arr[row-1][col] = 1
def block_two(arr, col):
row = 0
while row < 6:
if arr[row][col] == 1 or arr[row][col+1] == 1:
break
row += 1
arr[row-1][col] = 1
arr[row-1][col+1] = 1
def block_three(arr, col):
row = 0
while row < 5:
if arr[row][col] == 1 or arr[row+1][col] == 1:
break
row += 1
arr[row-1][col] = 1
arr[row][col] = 1
def row_clean(arr):
global score
for i in range(5, -1, -1):
if all(arr[i]):
arr.pop(i)
score += 1
def full_arr(arr):
l = len(arr)
for _ in range(6 - l):
arr.insert(0, [0] * 4)
def row_clean2(arr):
for i in range(2):
if any(arr[i]):
arr.pop()
def count_block(arr):
global total_count
for row in arr:
total_count += row.count(1)
func = {
1: lambda x: block_one(*x),
2: lambda x: block_two(*x),
3: lambda x: block_three(*x)
}
N = int(input())
green = [[0] * 4 for _ in range(6)]
blue = [[0] * 4 for _ in range(6)]
score = total_count = 0
for _ in range(N):
t, x, y = map(int, input().split())
if t == 1:
func[1]((green, y))
func[1]((blue, x))
elif t == 2:
func[2]((green, y))
func[3]((blue, x))
else:
func[3]((green, y))
func[2]((blue, x))
row_clean(green)
full_arr(green)
row_clean2(green)
full_arr(green)
row_clean(blue)
full_arr(blue)
row_clean2(blue)
full_arr(blue)
count_block(green)
count_block(blue)
print(score)
print(total_count)
print()