基礎練習26-2n皇后問題(python答案)

基礎練習 2n皇后問題

問題描述
  給定一個n*n的棋盤,棋盤中有一些位置不能放皇后。現在要向棋盤中放入n個黑皇后

和n個白皇后,使任意的兩個黑皇后都不在同一行、同一列或同一條對角線上,任意的兩

個白皇后都不在同一行、同一列或同一條對角線上。問總共有多少种放法?n小於等於8。
輸入格式
  輸入的第一行爲一個整數n,表示棋盤的大小。
  接下來n行,每行n個0或1的整數,如果一個整數爲1,表示對應的位置可以放皇后,

如果一個整數爲0,表示對應的位置不可以放皇后。
輸出格式
  輸出一個整數,表示總共有多少种放法。
樣例輸入
4
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
樣例輸出
2
樣例輸入
4
1 0 1 1
1 1 1 1
1 1 1 1
1 1 1 1
樣例輸出
0

算法思想如下,代碼中有參考鏈接:

在這裏插入圖片描述

“””
 -*- coding: utf-8 -*-
"""
Created on Sun Jan  5 08:55:58 2020

@author: Administrator
算法思想:https://blog.csdn.net/S2013122867/article/details/50310405
"""



def whitequeen(k):
    for i in range(k-1):
        pd = wqueen[i]-wqueen[k-1]
        if pd==0 or int(math.fabs(k-1-i))==int(math.fabs(pd)):
            return 0
    if k==n:
        blackqueen(0)
        return 0
    for j in range(n):
        if board[k][j]:
            wqueen[k]=j
            whitequeen(k+1)

def blackqueen(k):
    for i in range(k-1):
        pd = bqueen[i]-bqueen[k-1]
        if pd==0 or int(math.fabs(k-1-i))==int(math.fabs(pd)):
            return 0
    if k==n:
        global count
        count+=1
        return 0
    for j in range(n):
        if j!=wqueen[k] and board[k][j]:
            bqueen[k]=j
            blackqueen(k+1)

import math
count=0
n=int(input())
board=[[]*n]*n
wqueen = [0 for i in range(n)]
bqueen = [0 for i in range(n)]
for i in range(n):
    board[i] = [int(j) for j in input().split()]
whitequeen(0)
print(count)

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章