[N-Queen][Python]

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# BackTracking : Stack to store data, Recursion
def nqueen(result, N):
    global count
    if len(result) == N: # 정답 배열(result)의 길이가 N과 같아지면 result 을 프린트한다.
        count += 1
        print(count, result)
        return 0
    candidate = list(range(N)) # 0 부터 N-1 까지로 구성된 후보군(cadidate) 배열을 만든다.


    for i in range(len(result)): # 처음엔 [i] 만큼만. 이후 점점 한개씩 늘어난다.

        # 제외할 것 제외하고 이후 24번 줄에서 후보군 체크
        if result[i] in candidate: # 같은 열에 놓이는지 체크
            candidate.remove(result[i]) # 같은 열에 놓이면 후보군에서 제외

        distance = len(result) - i

        if result[i] + distance in candidate: # 같은 대각선 상에 놓이는지 체크
            candidate.remove(result[i] + distance) # 같은 대각선 상에 놓이면 후보군에서 제외
        if result[i] - distance in candidate: # 같은 대각선 상에 놓이는지 체크
            candidate.remove(result[i] - distance) # 같은 대각선 상에 놓이면 후보군에서 제외

    # 후보군 체크
    if candidate != []:
        for i in candidate:
            result.append(i) # 후보군의 요소를 정답 배열의 i+1 번째 요소로 설정
            nqueen(result, N) # 재귀적으로 다음 후보군 체크
            result.pop()
    else:
        return 0

count = 0
num = int(input("Input N : "))
for i in range(num):
    nqueen([i], num)
if count == 0:
    print("No solution")



# # BackTracking : Recursion
# def solve(idx):
#     global n
#     if idx == n:
#         return 1
#     ret = 0
#
#     for i in range(n):
#         selected[idx] = i
#         if isNQueen(idx):
#             ret += solve(idx+1)
#
#     return ret
#
# def isNQueen(idx):
#     for i in range(idx):
#         if selected[i] == selected[idx] or abs(idx-i) == abs(selected[idx]-selected[i]):
#             return False
#     return True
#
# for t in range(int(input())):
#     n = int(input())
#     selected = [0] * n
#     print("#{} {}".format(t+1, solve(0)))

댓글

이 블로그의 인기 게시물

[python]섬의 둘레구하기

백트래킹으로 부분집합구하기(Get Powerset usiing Backtracking)

[Python]DFS를 이용한 부분집합 구현