TIL) 9663 N-Queen

Mongle·2020년 12월 17일
0

🎯 pos[i] = j

체스판의 위치를 저장해놓을 때 이차원 배열로 할 수도 있지만 위와 같이 인덱스와 값을 이용해서 저장할 수도 있다.

💡 아이디어

  • 각 열에 한 개씩만 말이 올라갈 수 있기 때문에 i열에 올라간 말의 행의 위치를 j로 설정하면 pos[i] = j 로 저장할 수 있다.
  • set(i)에서 이미 열은 정해졌기 때문에 반복문을 통해 j를 설정한 후 조건문을 통해 해당 j행에 말이 있는지 확인하고 다시 조건문을 통해 대각선에 말이 있는지 abs_()를 통해서 확인한다.
  • 대각선에 말이 있는지 확인하는 방법은 절대값을 이용해서 확인할 수 있다.
  • i가 n-1이 되면 모든 열에 말을 놓았기 때문에 종료한다.
N = int(input())
pos = [0]*N
flag = [False]*N
answer = 0
# 출력


def abs_(i):
    count = 0
    if i == 0:
        return True
    else:
        for k in range(i):
            if abs(i - k) == abs(pos[i] - pos[k]):
                break
            else:
                count += 1
                continue
        if count == i:
            return True
        else:
            return False
# i열에 퀸을 배치
def set(i):
    global answer
    # i열 j행에 퀸을 배치
    for j in range(N):
        if not flag[j]:
            pos[i] = j
            if not abs_(i):
                continue
            # 종료조건
            if i == N-1:
                answer += 1
            else:
                flag[j] = True
                # 다음 열의 퀸을 배치
                set(i+1)
                # flag를 False로 돌려놓지 않으면 01234567 한 가지 경우만 출력되고 flag가 모두 True여서 프로그램이 종료됨
                # flag를 False로 돌려놔야 행, 열에 새로운 숫자가 들어갔을 때 다시 flag를 사용할 수 있음
                flag[j] = False

set(0)
print(answer)
profile
https://github.com/Jeongseo21

0개의 댓글