map이 정도 되면, BFS로 푸는 것이 낫다.
Call-By-Value
, Call-By-Reference
의 특성을 잘 알자.d=[]
rec=[]
visited=[]
N=0
def dfs(idx, val):
global d, rec, visited, N
rec[idx]=val
if idx+1 == N:
print(*rec)
return
for i in range(0,len(d)):
if visited[d[i]]:
continue
visited[d[i]]=True
dfs(idx+1,d[i])
visited[d[i]]=False
if __name__ == '__main__':
N=3
d=[2,5,7]
rec=[0,0,0]
visited={2:False, 5:False, 7:False}
for i in range(0,len(d)):
visited[d[i]]=True
dfs(0,d[i])
visited[d[i]]=False
import itertools
d=[]
rec=[]
visited=[]
N=0
def gen(max_dep):
for i in (itertools.permutations(d,max_dep)):
yield i
if __name__ == '__main__':
N=4
d=[6,5,3,1]
max_depth=4
for i in gen(max_depth):
print(i)
# 혹은 하나 빼고 출력
get=gen(max_depth)
print(get) # <generator object gen at 0x1234578>
pring(next(get)) # (0,1)
# ===== 출력 ===== #
(6, 5, 3, 1)
(6, 5, 1, 3)
(6, 3, 5, 1)
(6, 3, 1, 5)
(6, 1, 5, 3)
(6, 1, 3, 5)
(5, 6, 3, 1)
(5, 6, 1, 3)
(5, 3, 6, 1)
(5, 3, 1, 6)
(5, 1, 6, 3)
(5, 1, 3, 6)
(3, 6, 5, 1)
(3, 6, 1, 5)
(3, 5, 6, 1)
(3, 5, 1, 6)
(3, 1, 6, 5)
(3, 1, 5, 6)
(1, 6, 5, 3)
(1, 6, 3, 5)
(1, 5, 6, 3)
(1, 5, 3, 6)
(1, 3, 6, 5)
(1, 3, 5, 6)
d=[]
rec=[]
N=0
def dfs(idx, val):
global d, rec, N
rec[idx]=val
if idx+1 == N:
print(*rec)
return
for i in range(0,len(d)):
dfs(idx+1,d[i])
if __name__ == '__main__':
N=3
d=[2,5,7]
rec=[0,0,0]
for i in range(0,len(d)):
dfs(0,d[i])
itertools.permutations()
itertools.products(d,repeat=' ')
!!!import itertools
d=[]
rec=[]
visited=[]
N=0
def gen():
for i in (itertools.product(d,repeat=4)):
yield i
if __name__ == '__main__':
N=4
d=[6,5,3,1]
for i in gen():
print(i)
# === 출력 === #
(6, 6, 6, 6)
(6, 6, 6, 5)
(6, 6, 6, 3)
(6, 6, 6, 1)
(6, 6, 5, 6)
(6, 6, 5, 5)
(6, 6, 5, 3)
(6, 6, 5, 1)
(6, 6, 3, 6)
(6, 6, 3, 5)
(6, 6, 3, 3)
(6, 6, 3, 1)
(6, 6, 1, 6)
(6, 6, 1, 5)
(6, 6, 1, 3)
(6, 6, 1, 1)
(6, 5, 6, 6)
(6, 5, 6, 5)
(6, 5, 6, 3)
(6, 5, 6, 1)
(6, 5, 5, 6)
(6, 5, 5, 5)
(6, 5, 5, 3)
(6, 5, 5, 1)
(6, 5, 3, 6)
(6, 5, 3, 5)
...중략...
(1, 1, 3, 5)
(1, 1, 3, 3)
(1, 1, 3, 1)
(1, 1, 1, 6)
(1, 1, 1, 5)
(1, 1, 1, 3)
(1, 1, 1, 1)
itertools
를 import 할 수 있으면 제일 편하다.
import itertools
d=[]
rec=[]
visited=[]
N=0
def gen(max_dep):
for i in (itertools.combinations(d,max_dep)):
yield i
if __name__ == '__main__':
N=4
d=[6,5,3,1]
max_depth=2
for i in gen(max_depth):
print(i)
# ====== 출력 ====== #
(6, 5)
(6, 3)
(6, 1)
(5, 3)
(5, 1)
(3, 1)
import itertools
d=[]
rec=[]
visited=[]
N=0
def gen(max_dep):
for i in (itertools.combinations_with_replacement(d,max_dep)):
yield i
if __name__ == '__main__':
N=4
d=[6,5,3,1]
max_depth=2
for i in gen(max_depth):
print(i)
# ====== 출력 ====== #
(6, 6)
(6, 5)
(6, 3)
(6, 1)
(5, 5)
(5, 3)
(5, 1)
(3, 3)
(3, 1)
(1, 1)
3 6
12
15
10
6
3
3
2
3
7
12
1. 선 방문
2. 후 큐 넣기
while not q.empty():
now, before, now_time=q.get_nowait()
if visited[now] > now_time: # 현재 경로에 도착하는데 더 낮은 가중치로 가능하는 '갱신' 프로시저
visited[now]=now_time # 현재 경로에 도착하는데 더 낮은 가중치 갱신
path[now]=before # path[현재 vertex]=이전vertex 담기
....
visited
에서 하나 시작해야함.https://paris-in-the-rain.tistory.com/m/89?category=819756
https://hooongs.tistory.com/264
.
만큼 버틸 수 있다..
을 5개 만나므로 다음 파도가 치면 무너진다.map
에서 0
(.
)일 경우만 Q에 넣는다.8
이하의 값을 가진 모래성을 관리하며, dfs
로 풀면 될 줄 알았으나, map이 이므로 너무 많은 수가 요구된다..
일때는 0
으로 다시 삽입하자! if maps[i][j] == '.':
maps[i][j]=0
Q.append((i,j)) <-- "0"일 경우만 Q에 넣는다.
else:
maps[i][j] = int(maps[i][j])
ans = 0
while Q:
x,y = Q.popleft()
if maps[nx][ny] != 0:
maps[nx][ny] -=1
if maps[nx][ny] == 0:
visited[nx][ny] = visited[x][y]+1
ans = max(ans, visited[nx][ny])
Q.append((nx,ny))
2022-08-31 출쳌 ..👼