https://www.acmicpc.net/problem/2642
시간 1초, 메모리 128MB
input :
output :
정육면체 전개도는 11가지이다. 근데 이 11가지를 뒤집고, 돌린 경우도 따져야 한다. 이걸 딕셔너리로 만들어서 하는 방법은 도저히 모르겠고 에러가 날 거 같아서 포기했다.
-> 맞은편을 찾기 위해서는 동일한 방향으로 2번 이동했을 때의 면을 찾아야 한다.
-> 맞은 편 면이 추가적으로 존재하는지. 찾아야 할 거 같은데 (보류)
-> 1, 2, 3, 4, 5, 6 말고 추가적인 숫자 혹은 더 적은 숫자가 존재하는 지 확인한다.
찐 구현으로 미친놈처럼 다 만들어서 하고 싶었는데 방향 바뀌는 게 너무 큰 거 같다.
사실 11개 만들어서 4방으로 뒤집고, 4방으로 회전 시켜서 만들면 될 거 같은데 나중에 "1"의 맞은 편 찾는게 매우 귀찮을 거 같았다.
import sys
def dfs(x, y, direction, now_direct, cnt, num):
if cnt == 2 and direction == now_direct:
oppo[num].append(graph[x][y])
return
visit[x][y] = 1
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if nx < 0 or nx >= 6 or ny < 0 or ny >= 6:
continue
if graph[nx][ny] == 0:
continue
if visit[nx][ny] == 1:
continue
if direction == i:
cnt += 1
visit[nx][ny] = 1
dfs(nx, ny, direction, i, cnt, num)
if direction == i:
cnt -= 1
return 0
graph, oppo = [], [[] for _ in range(7)]
# 오른쪽, 왼쪽, 아래, 위
dx = [0, 0, 1, -1]
dy = [1, -1, 0, 0]
for _ in range(6):
temp = list(map(int, sys.stdin.readline().split()))
graph.append(temp)
total = 0
for item in graph:
total += sum(item)
if total != 21:
print(0)
exit(0)
for x in range(6):
for y in range(6):
if graph[x][y] != 0:
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if nx < 0 or nx >= 6 or ny < 0 or ny >= 6:
continue
if graph[nx][ny] == 0:
continue
visit = [[0] * 6 for _ in range(6)]
visit[x][y] = 1
dfs(nx, ny, i, i, 1, graph[x][y])
flag = 0
for item in oppo[1:]:
if len(item) >= 2 or len(item) == 0:
flag = 1
if not flag:
print(oppo[1][0])
else:
print(0)