Files
Algorithm/백준/Gold/1941. 소문난 칠공주/소문난 칠공주.py

64 lines
2.2 KiB
Python

from collections import deque
# bfs로 7명의 여학생이 붙어있는지 확인한다.
def bfs(arr):
dr = [-1, +1, 0, 0] # 상하좌우
dc = [0, 0, -1, +1] # 상하좌우
# 7명 여학생 위치 방문처리를 위한 리스트 1로 처리
visited = [[1] * 5 for _ in range(5)]
# 7명의 여학생 위치를 0으로 초기화
for i in arr:
visited[i[0]][i[1]] = 0
# 첫번째 여학생의 위치를 큐에 넣는다.
queue = deque([(arr[0])])
# 첫번째 여학생의 방문처리를 1로 변경
visited[arr[0][0]][arr[0][1]] = 1
check = 1 # 여학생들의 위치 방문 횟수(첫 위치 방문했기 때문에 1)
while queue:
r, c = queue.popleft() # 큐에 있는 위치 꺼내기
for i in range(4): # 델타 위치를 이동하면서
nr = r + dr[i]
nc = c + dc[i]
# 범위를 벗어나면 진행x
if nr < 0 or nr >= 5 or nc < 0 or nc >= 5:
continue
# 만약 위치를 이동하다 아직 여학생 위치를 방문안했다면
if not visited[nr][nc]:
visited[nr][nc] = 1 # 그위치를 1로 바꿔주고
check += 1 # 방문 횟수를 1 증가
queue.append((nr, nc)) # 큐에 추가
if check != 7: # 7번다 방문하지 않았다면
return False
else: # 7번 방문했다면
return True
def dfs(depth, start, count):
global result
if count >= 4: # 만약 임도연파가 4명이상이라면
return # 재귀 탈출
if depth == 7: # 7명을 뽑았다면
if bfs(arr): # 모든 여학생들이 붙어있다면
result += 1 # 횟수 1번 추가
return
for i in range(start, 25):
r = i // 5 # 총 25번 중 행은 i 나누기 5와 같다.
c = i % 5 # 총 25번 중 열은 i를 5로 나눈 나머지와 같다.
arr.append((r, c)) # 해당 위치를 추가
dfs(depth + 1, i + 1, count + (students[r][c] == 'Y')) # 재귀 돈다.
arr.pop() # 해당 위치를 제거
students = [list(input()) for _ in range(5)]
arr = []
result = 0
dfs(0, 0, 0)
print(result)