9663号nQueen.py


9663号nQueen。py


BackTrackingで解答します.
「希望のあるノードのみをチェックし、迷わなければ親ノードに戻って探索を続けます」

問題の概要


クイーンは上下左右の対角線で移動できます

0.すべての状況を考慮した数量


すべての可能なシーケンスで、どのように答えを検索しますか?
N=4仮定、
皇后ごとに1列しか来られないからです.
検査が必要なものはすべて4 4 4*4=256種類あります.->ナビゲーションが不要になるまでナビゲーション効率が低下

1.バックトレース


dfs、bfsを使用して、特定のノードの潜在力を確認します.
希望がない場合は、そのノードの親ノードに戻り、次のノードを検索するプロセスを続行します.
可能性チェックルール
  • の同じ列にはできません.
  • のような"/"対角線にはできません.
  • のような「」対角線に立ってはいけません.
  • 状態空間ツリー(N=4)


    import sys
    input = sys.stdin.readline
    
    n = int(input())
    
    def dfs(row):
        global count
        if row == n:
            count += 1   # 백트래킹을 통해서 마지막까지 도달했기 때문에 count += 1
            return
        for col in range(n):
            queen[row] = col    # 행에 모든 경우의 수를 넣는다. (row, col) 위치에 퀸을 놓으면
            for i in range(row):    # 대각선과 열에 퀸이 있는 확인
                if queen[i] == queen[row] or abs(queen[i]-queen[row]) == row - i:
                    break
            else:
                # `else :` 는 break 를 만나지 않고 무사히 `for i in range (row)`을 통과하면 실행된다.
                # 즉 퀸이 현재 위치에 있어도 된다는 의미로 검사를 진행한다.
                dfs(row + 1)
    
    queen = [0] * n
    count = 0
    dfs(0)
    print(count)