Python學習日誌2021 01 29

2021-10-18 06:41:18 字數 1741 閱讀 5826

設計一種演算法,列印 n 皇后在 n × n 棋盤上的各種擺法,其中每個皇后都不同行、不同列,也不在對角線上。這裡的「對角線」指的是所有的對角線,不只是平分整個棋盤的那兩條對角線。

為了判斷乙個位置所在的列和兩條斜線上是否已經有皇后,使用三個集合 columns

,diagonals1,

diagonals

2\textit, \textit_1, \textit_2

columns

,diagonals1​

,diagonals2​

分別記錄每一列以及兩個方向的每條斜線上是否有皇后。

列的表示法很直觀,一共有 n 列,每一列的下標範圍從 0 到 n−1,使用列的下標即可明確表示每一列。

如何表示兩個方向的斜線呢?對於每個方向的斜線,需要找到斜線上的每個位置的行下標與列下標之間的關係。

方向一的斜線為從左上到右下方向,同一條斜線上的每個位置滿足行下標與列下標之差相等,例如 (0,0) 和 (3,3) 在同一條方向一的斜線上。因此使用行下標與列下標之差即可明確表示每一條方向一的斜線。

方向二的斜線為從右上到左下方向,同一條斜線上的每個位置滿足行下標與列下標之和相等,例如 (3,0) 和 (1,2) 在同一條方向二的斜線上。因此使用行下標與列下標之和即可明確表示每一條方向二的斜線。

class

solution

:def

solvenqueens

(self, n:

int)

-> list[list[

str]]:

defbacktrack

(row :

int)

:if row==n:

board = generateboard(

)else

:for i in

range

(n):

if i in columns or row-i in diagonals1 or row+i in diagonals2:

continue

queens[row]

=i columns.add(i)

diagonals1.add(row-i)

diagonals2.add(row+i)

backtrack(row+1)

columns.remove(i)

diagonals1.remove(row-i)

diagonals2.remove(row+i)

defgenerateboard()

: board =

list()

for i in

range

(n):

rows[queens[i]]=

"q"""

.join(rows)

) rows[queens[i]]=

"."return board

solutions =

list()

columns =

set(

) queens =[-

1]*n rows =

['.']*n

diagonals1 =

set(

) diagonals2 =

set(

) backtrack(0)

return solutions

python學習日誌

1 python中range xrange 和np.arange 區別 range 多用於迴圈,返回乙個range物件,若想要返回乙個list則前面加上list轉換 arange 是numpy中的函式,np.range 返回乙個array型別的物件,可以使用小數步長 xrange 返回xrange ...

Python學習日誌

元組不可修改,但是可以給儲存元組的變數賦值。現在每學乙個東西就會莫名的拿去和之前學過的東西做一比較,python是真的太舒服了。當然寫for or if 都是要記得後面的 而且也可以進行級聯,只不過是if,elfe,else。還可以用in來判斷某個元素在沒有某個列表裡面。字典是一系列鍵值對,新增起來...

python 學習日誌

1 pip is already installed if you re using python 2 2.7.9 or python 3 3.4 binaries downloaded from python.org,but you ll need to upgrade pip 2 upgradi...