def n_queens (col, i):
n = len(col) -1
//n=(열의 개수-1) 예) 5열이면 n=4
if (promising(i, col)):
if (i == n):
//i가 끝까지 다 나왔음
print(col[1: n+1])
//i=n이면 1열부터 (n+1)열까지 출력 예)
else:
for j in range(1, n+1):
// 아직 j가 끝까지 못간 경우에 대해 n+1까지 증가할때
col[i+1] = j
n_queens(i+1, col)
//(i+1)에 j를 할당 -> 새로운 수 i+1에 대해 다시 반복
def promising (i, col):
k = 1
flag = True
while (k < i and flag):
if (col[i] == col[k] or abs(col[i] - col[k]) == (i - k)):
//1) 동일한 열에 있는가 or 2) 동일한 대각선에 위치
flag = False
//flag를 거짓으로 설정
k += 1
return flag;
Math.abs(n)
정수 인수 n의 절대값을 반환한다.
col[i]
: i번째 행에서 퀸이 놓여져 있는 열의 위치
알고리즘 계산식 분석
1) 같은 열에 있는지 체크한다.
col[i] == col[k]
i행에 있는 퀸의 열과 k행에 있는 퀸의 열이 동일
2) 대각선 체크한다.
col[i]-col[k] == i-k
(i행에 있는 퀸의 열)-(k행에 있는 퀸의 열)=(i-k)
시험하기
n=4
col=[0] * (n+1)
n_queens(col, 0)
[2, 4, 1, 3] => col[1]=2, col[2]=4, col[3]=1, col[4]=3
[3, 1, 4, 2] => col[1]=3, col[2]=1, col[3]=4, col[4]=2
얘네를 그려서 보면 y축 대칭임
n=8
col=[0] * (n+1)
n_queens(col, 0)
#### IMPORTS
import itertools
#### FUNCTIONS ####
def create_empty_board(N):
"Create an NxN board of zeros"
return [[0]*N for _ in range(N)]
def perm_to_board(perm):
"Makes a full board board from a given permutation"
board = create_empty_board(len(perm))
for ndx in range(len(perm)):
board[perm[ndx]][ndx] = 1
return board
def print_perm(perm):
"Pretty print utility function"
print()
print(perm," =" )
print_board(perm_to_board(perm))
def is_solution(perm):
"Check if input array contains queens on the same diagonal"
for (i,j) in itertools.combinations(range(len(perm)), 2):
if ( abs(i-j) == abs(perm[i]-perm[j]) ): return False
return True
def find_permutations(N):
"Find all possible permuations of 0-(N-1)"
return list(itertools.permutations(range(0,N)))
def find_first_solutions(all_permutations):
"Utility function that checks validity of each solution"
for perm in all_permutations:
if is_solution(perm): return perm
if __name__ == '__main__':
# input size of board = number of queens
print("How many queens to place?")
# convert input string to a number
N = int(input())
# find all permutations of N queens
all_permuations = find_permutations(N)
# go through all perms, return first valid one
perm = find_first_solutions(all_permuations)
# pretty print the perm and board
print_perm(perm)
brute-force의 확장버전
: 해결방안이 발견되면 후보평가를 중단했음. => 더 많은 계싼이 필요하나 모든 솔루션을 제공하기 위해 후보를 계속해서 평가함