Skip to content

Commit 3112194

Browse files
authored
Merge pull request #138 from alsrl8/alsrl8
Alsrl8
2 parents ea012e0 + 328bb66 commit 3112194

File tree

4 files changed

+190
-0
lines changed

4 files changed

+190
-0
lines changed
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
from collections import deque
2+
3+
R, C = 12, 6
4+
grid = [list(input().rstrip()) for _ in range(R)]
5+
dRow, dCol = [0, 0, 1, -1], [1, -1, 0, 0]
6+
7+
8+
def get_explosive_puyo():
9+
candidates = []
10+
visited = [[False for _ in range(C)] for _ in range(R)]
11+
for r in range(R):
12+
for c in range(C):
13+
if grid[r][c] == '.':
14+
continue
15+
elif visited[r][c]:
16+
continue
17+
q = deque()
18+
q.append((r, c))
19+
visited[r][c] = True
20+
members = [(r, c)]
21+
while q:
22+
_r, _c = q.popleft()
23+
for d in range(4):
24+
nr, nc = _r + dRow[d], _c + dCol[d]
25+
if nr < 0 or nc < 0 or nr >= R or nc >= C:
26+
continue
27+
elif grid[nr][nc] != grid[r][c]:
28+
continue
29+
elif visited[nr][nc]:
30+
continue
31+
q.append((nr, nc))
32+
visited[nr][nc] = True
33+
members.append((nr, nc))
34+
if len(members) >= 4:
35+
candidates.append(members)
36+
return candidates
37+
38+
39+
def activate_gravity():
40+
for c in range(C):
41+
empty = 0
42+
for r in range(R - 1, -1, -1):
43+
if grid[r][c] != '.':
44+
if empty == 0:
45+
continue
46+
grid[r + empty][c] = grid[r][c]
47+
grid[r][c] = '.'
48+
else:
49+
empty += 1
50+
51+
52+
answer = 0
53+
while True:
54+
explosive_puyos = get_explosive_puyo()
55+
if not explosive_puyos:
56+
break
57+
for puyo in explosive_puyos:
58+
for r, c in puyo:
59+
grid[r][c] = '.'
60+
activate_gravity()
61+
answer += 1
62+
63+
print(answer)
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
N = int(input())
2+
A = list(map(int, input().split()))
3+
4+
5+
def divine_conquer(start, end):
6+
cnt = 0
7+
if start >= end:
8+
return 0
9+
m = (start + end) // 2
10+
l, r = start, m + 1
11+
cnt += divine_conquer(start, m)
12+
cnt += divine_conquer(m + 1, end)
13+
14+
temp = []
15+
while l <= m and r <= end:
16+
if A[l] <= A[r]:
17+
temp.append(A[l])
18+
l += 1
19+
else:
20+
temp.append(A[r])
21+
r += 1
22+
cnt += (m + 1 - l)
23+
24+
if l <= m:
25+
temp.extend(A[l:m + 1])
26+
if r <= end:
27+
temp.extend(A[r:end + 1])
28+
29+
for i in range(start, end + 1):
30+
A[i] = temp[i - start]
31+
32+
return cnt
33+
34+
answer = divine_conquer(0, N - 1)
35+
print(answer)
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import sys
2+
3+
N, M, K = map(int, sys.stdin.readline().split())
4+
paper = [[0 for _ in range(M)] for _ in range(N)]
5+
6+
7+
def is_valid(r, c, sticker):
8+
if r + len(sticker) > N or c + len(sticker[0]) > M:
9+
return False
10+
for _r in range(len(sticker)):
11+
for _c in range(len(sticker[0])):
12+
if sticker[_r][_c] == 1 and paper[r + _r][c + _c] == 1:
13+
return False
14+
return True
15+
16+
17+
def turn_clockwise(sticker):
18+
R, C = len(sticker), len(sticker[0])
19+
turned = [[0 for _ in range(R)] for _ in range(C)]
20+
for r in range(R):
21+
for c in range(C):
22+
turned[c][R - r - 1] = sticker[r][c]
23+
return turned
24+
25+
26+
def put_sticker(r, c, sticker):
27+
for _r in range(len(sticker)):
28+
for _c in range(len(sticker[0])):
29+
if sticker[_r][_c] == 1:
30+
paper[r + _r][c + _c] = sticker[_r][_c]
31+
32+
33+
def search(sticker):
34+
for r in range(N):
35+
for c in range(M):
36+
if is_valid(r, c, sticker):
37+
return r, c
38+
return -1, -1
39+
40+
41+
for i in range(K):
42+
R, C = map(int, sys.stdin.readline().split())
43+
sticker = [list(map(int, sys.stdin.readline().split())) for _ in range(R)]
44+
turn_cnt, flag = 0, False
45+
while turn_cnt < 4:
46+
r, c = search(sticker)
47+
if r < 0:
48+
sticker = turn_clockwise(sticker)
49+
turn_cnt += 1
50+
else:
51+
flag = True
52+
break
53+
if flag:
54+
put_sticker(r, c, sticker)
55+
56+
answer = 0
57+
for r in range(N):
58+
for c in range(M):
59+
if paper[r][c] == 1:
60+
answer += 1
61+
print(answer)
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
from itertools import combinations
2+
from collections import deque
3+
4+
grid = [input().rstrip() for _ in range(5)]
5+
arr = [(r, c) for r in range(5) for c in range(5)]
6+
comb = list(combinations(arr, 7)) # 480700
7+
dRow, dCol = [0, 0, 1, -1], [1, -1, 0, 0]
8+
9+
answer = 0
10+
for _comb in comb:
11+
cnt_s = 0
12+
for r, c in _comb:
13+
if grid[r][c] == 'S':
14+
cnt_s += 1
15+
if cnt_s < 4:
16+
continue
17+
r, c = _comb[0]
18+
q = deque()
19+
q.append((r, c))
20+
visited = set()
21+
visited.add((r, c))
22+
while q:
23+
_r, _c = q.popleft()
24+
for d in range(4):
25+
nr, nc = _r + dRow[d], _c + dCol[d]
26+
if (nr, nc) in _comb and (nr, nc) not in visited:
27+
q.append((nr, nc))
28+
visited.add((nr, nc))
29+
if len(visited) == 7:
30+
answer += 1
31+
print(answer)

0 commit comments

Comments
 (0)