-
[백준] 17822 - 원판 돌리기 (파이썬)알고리즘/백준 2021. 9. 28. 18:06
import sys sys.setrecursionlimit(10**5) n,m,t = map(int,input().split()) circle = [] for _ in range(n): circle.append(list(map(int,input().split()))) circle.append([0 for _ in range(m)]) def rt(idx,d,x): if d == 0: for _ in range(x): last = circle[idx][-1] for i in range(m-1,0,-1): circle[idx][i] = circle[idx][i-1] circle[idx][0] = last elif d == 1: for _ in range(x): last = circle[idx][0] for i in range(m-1): circle[idx][i] = circle[idx][i+1] circle[idx][-1] = last def DFS(v,idx,target): if v==n-1: if idx == 0: if circle[v][m-1] == target: circle[v][m-1] = 0 DFS(v,m-1,target) if circle[v][idx+1] == target: circle[v][idx+1] = 0 DFS(v,idx+1,target) elif idx == m-1: if circle[v][0] == target: circle[v][0] = 0 DFS(v,0,target) if circle[v][m-2] == target: circle[v][m-2] = 0 DFS(v,m-2,target) else: if circle[v][idx+1] == target: circle[v][idx+1] = 0 DFS(v,idx+1,target) if circle[v][idx-1] == target: circle[v][idx-1] = 0 DFS(v,idx-1,target) elif v==0: if idx == 0: if circle[v][m-1] == target: circle[v][m-1] = 0 DFS(v,m-1,target) if circle[v+1][m-1] == target: circle[v+1][m-1] = 0 DFS(v+1,m-1,target) if circle[v][1] == target: circle[v][1] = 0 DFS(v,1,target) if circle[v+1][1] == target: circle[v+1][1] = 0 DFS(v+1,1,target) if circle[v+1][idx] == target: circle[v+1][idx] = 0 DFS(v+1,idx,target) elif idx == m-1: if circle[v][0] == target: circle[v][0] = 0 DFS(v,0,target) if circle[v+1][0] == target: circle[v+1][0] = 0 DFS(v+1,0,target) if circle[v][m-2] == target: circle[v][m-2] = 0 DFS(v,m-2,target) if circle[v+1][m-2] == target: circle[v+1][m-2] = 0 DFS(v+1,m-2,target) if circle[v+1][idx] == target: circle[v+1][idx] = 0 DFS(v+1,idx,target) else: if circle[v][idx-1] == target: circle[v][idx-1] = 0 DFS(v,idx-1,target) if circle[v+1][idx-1] == target: circle[v+1][idx-1] = 0 DFS(v+1,idx-1,target) if circle[v][idx+1] == target: circle[v][idx+1] = 0 DFS(v,idx+1,target) if circle[v+1][idx+1] == target: circle[v+1][idx+1] = 0 DFS(v+1,idx+1,target) if circle[v+1][idx] == target: circle[v+1][idx] = 0 DFS(v+1,idx,target) else: if idx == 0: if circle[v][m-1] == target: circle[v][m-1] = 0 DFS(v,m-1,target) if circle[v+1][m-1] == target: circle[v+1][m-1] = 0 DFS(v+1,m-1,target) if circle[v-1][m-1] == target: circle[v-1][m-1] = 0 DFS(v-1,m-1,target) if circle[v][1] == target: circle[v][1] = 0 DFS(v,1,target) if circle[v+1][1] == target: circle[v+1][1] = 0 DFS(v+1,1,target) if circle[v-1][1] == target: circle[v-1][1] = 0 DFS(v-1,1,target) if circle[v+1][idx] == target: circle[v+1][idx] = 0 DFS(v+1,idx,target) if circle[v-1][idx] == target: circle[v-1][idx] = 0 DFS(v-1,idx,target) elif idx == m-1: if circle[v][0] == target: circle[v][0] = 0 DFS(v,0,target) if circle[v+1][0] == target: circle[v+1][0] = 0 DFS(v+1,0,target) if circle[v-1][0] == target: circle[v-1][0] = 0 DFS(v-1,0,target) if circle[v][m-2] == target: circle[v][m-2] = 0 DFS(v,m-2,target) if circle[v+1][m-2] == target: circle[v+1][m-2] = 0 DFS(v+1,m-2,target) if circle[v-1][m-2] == target: circle[v-1][m-2] = 0 DFS(v-1,m-2,target) if circle[v+1][idx] == target: circle[v+1][idx] = 0 DFS(v+1,idx,target) if circle[v-1][idx] == target: circle[v-1][idx] = 0 DFS(v-1,idx,target) else: if circle[v][idx-1] == target: circle[v][idx-1] = 0 DFS(v,idx-1,target) if circle[v+1][idx-1] == target: circle[v+1][idx-1] = 0 DFS(v+1,idx-1,target) if circle[v-1][idx-1] == target: circle[v-1][idx-1] = 0 DFS(v-1,idx-1,target) if circle[v][idx+1] == target: circle[v][idx+1] = 0 DFS(v,idx+1,target) if circle[v+1][idx+1] == target: circle[v+1][idx+1] = 0 DFS(v+1,idx+1,target) if circle[v-1][idx+1] == target: circle[v-1][idx+1] = 0 DFS(v-1,idx+1,target) if circle[v+1][idx] == target: circle[v+1][idx] = 0 DFS(v+1,idx,target) if circle[v-1][idx] == target: circle[v-1][idx] = 0 DFS(v-1,idx,target) for kk in range(t): idx, d, x = map(int,input().split()) for i in range(idx,n+1,idx): rt(i-1,d,x) ttt = 0 for i in range(n): for j in range(m): if circle[i][j] == 0: continue if j == 0: if circle[i][m-1] == circle[i][0] or circle[i][1] == circle[i][0] or circle[i+1][0] == circle[i][0]: ttt = 1 k = circle[i][j] circle[i][0] = 0 DFS(i,j,k) elif j == m-1: if circle[i][0] == circle[i][m-1] or circle[i][m-2] == circle[i][m-1] or circle[i+1][j] == circle[i][j]: ttt = 1 k = circle[i][j] circle[i][j] = 0 DFS(i,j,k) else: if circle[i][j-1] == circle[i][j] or circle[i][j+1] == circle[i][j] or circle[i+1][j] == circle[i][j]: ttt = 1 k = circle[i][j] circle[i][j] = 0 DFS(i,j,k) if ttt == 0: count = 0 sm = 0 for i in range(n): for j in range(m): if circle[i][j] != 0: count += 1 sm += circle[i][j] if count == 0: av = 0 else: av = sm/count for i in range(n): for j in range(m): if circle[i][j] != 0: if circle[i][j] > av: circle[i][j] -= 1 elif circle[i][j] < av: circle[i][j] += 1 sm = 0 for i in range(n): for j in range(m): sm += circle[i][j] print(sm)
진짜 멍청하게 DFS로 풀어서 230줄.. 생각을 더욱 오래하고 시작하는게 좋을 것 같다.
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 20055 - 컨베이어 벨트 위의 로봇 (파이썬) (0) 2021.09.30 [백준] 1915 - 가장 큰 정사각형 (파이썬) (0) 2021.09.29 [백준] 19238 - 스타트 택시 (파이썬) (0) 2021.09.28 [백준] 17142 - 연구소 3 (파이썬) (0) 2021.09.26 [백준] 17144 - 미세먼지 안녕! (파이썬) (0) 2021.09.25