Computer Science/Algorithm

[백준] 9663 - N-Queen (Python)

수제햄버거 2021. 2. 13. 13:06
728x90
반응형

문제 출처:

www.acmicpc.net/problem/9663

 

9663번: N-Queen

N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.

www.acmicpc.net

문제 풀이:

  • 사실 풀다가 대각선 부분을 어떻게 해결해야할지몰라서 (아래에서 위로) 결국 풀이를 좀 보고 풀었다.
  • 각 줄에 우선적으로 1개를 두고 그후 각 대각선 에 놓을 수 없는 자리에 check를 해둔 후에 재귀를 통해서 해결한다.
  • 풀이에도 자세히 나와있지만 (x,y)에 놧을경우 같은 대각선인 경우는  x+y 가 같은경우, x-y가 같은경우(이경우엔 음수처리를 해주어야 한다) 를 보면 같은 대각선을 알 수 있다.
cnt=0
isused1 = [0]*40
isused2 = [0]*40
isused3 = [0]*40


def func(cur):
    global n,cnt

    if(cur==n):
        cnt+=1
        return

    for i in range(0,n):
        if(isused1[i] or isused2[i+cur] or isused3[cur-i+n-1]):
            continue
        isused1[i]=1
        isused2[i+cur]=1
        isused3[cur-i+n-1]=1
        func(cur+1)
        isused1[i] = 0
        isused2[i + cur] = 0
        isused3[cur - i + n - 1] = 0


if __name__ == "__main__":
    n = int(input())
    func(0)
    print(cnt)

* Python으로 제출하면 시간초과가 뜬다.. Pypy3는 되는데 시간복잡도가 O(n!)이지만 가지치기를 통해서 꽤나 잘 돌꺼라고 생각햇는데 아닌가 보다..

반응형