-
[Python]백준 9663번/N-Queen/백트래킹algorithm/문제 2023. 3. 31. 16:02반응형
https://www.acmicpc.net/problem/9663
⚡️ 문제 설명
N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제
퀸을 놓는 방법의 수를 구하는 프로그램
⚡️ 해결 방법
퀸이 서로 공격할 수 없도록 하는 방법
1. 같은 행에 위치하면 안됨
2. 같은 열에 위치하면 안됨
3. 대각선상에 위치하면 안됨
graph_col 은 X행에서 퀸이 놓인 열의 위치를 저장할 것이다.
queen을 놓은 뒤 이 queen의 자리가 promising 한지 확인해야한다.
이를 확인하는 함수가 promising 함수이다.
이 방식으로 하면 같은 행에 위치할 queen은 없기 때문에 같은 행인지 체크는 하지 않아도 된다.
나머지 같은 열에 위치하는지 graph_col[before_row] == graph_col[row]
대각선상에 위치하는지 abs(graph_col[before_row]-graph_col[row])==abs(before_row-row))
확인한다.
⚡️ 코드
import sys input = sys.stdin.readline n = int(input()) def promising(row): for before_row in range(row): # 같은 열 or 같은 대각선 상에 있는 경우 if(graph_col[before_row] == graph_col[row] or abs(graph_col[before_row]-graph_col[row])==abs(before_row-row)): return False return True result = 0 graph_col = [0] * n def dfs(row): global result if row == n: result += 1 else: for i in range(n): # Queen 놓기 graph_col[row] = i if promising(row): dfs(row+1) dfs(0) print(result)
반응형'algorithm > 문제' 카테고리의 다른 글
[Python]프로그래머스/베스트앨범/해시 (0) 2023.05.26 [Python]프로그래머스 N으로 표현/dp (0) 2023.04.28 [Python]백준 13335번/트럭/queue (0) 2023.03.29 [Python]백준 11441/합 구하기 / 누적합 (0) 2022.03.14 [Python]백준 11053/가장 긴 증가하는 부분 수열/LIS/dp (0) 2022.03.13