設計一種演算法,列印 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...