面試題 08.12. 八皇后
設計一種演算法,列印 n 皇后在 n × n 棋盤上的各種擺法,其中每個皇后都不同行、不同列,
也不在對角線上。這裡的「對角線」指的是所有的對角線,不只是平分整個棋盤的那兩條對角線。
注意:本題相對原題做了擴充套件
示例:輸入:4
輸出:[[".q…","…q",「q…」,"…q."],["…q.",「q…」,"…q",".q…"]]
解釋: 4 皇后問題存在如下兩個不同的解法。
[[".q…", // 解法 1
「…q」,
「q…」,
「…q.」],
["…q.", // 解法 2
「q…」,
「…q」,
「.q…」]
]首先是一種回溯方法,當前位置合格就放入q,回溯,刪除q。
from typing import list
class
solution
:def
solvenqueens
(self, n:
int)
-> list[list[
str]]:
out =
board =[[
"."]
*n for _ in
range
(n)]
defis_vaild
(board,row,col, n)
:for i in
range(1
,min
(row,col)+1
):if board[row-i]
[col-i]
=='q'
:return
false
for i in
range(1
,min
(row+
1, n-col)):
if board[row-i]
[col+i]
=='q'
:return
false
for j in
range
(row)
:if board[j]
[col]
=='q'
:return
false
return
true
defbacktrack
(board, row:
int)
:if row == n:
res =
for j in board:
''.join(j)
)return
for col in
range
(n):
ifnot is_vaild(board,row,col,n)
:continue
board[row]
[col]
='q'
backtrack(board, row+1)
board[row]
[col]
='.'
backtrack(board,0)
return out
if __name__ ==
"__main__"
: s = solution(
)print
(s.solvenqueens(8)
)
經過提交後發現速度不是很快,因為在判斷當前位置是否合法的地方存在這大量的計算,所以可以使用乙個**對已經填充過的位置進行記錄。在驗證的時候就不用乙個乙個再去判斷了。
使用**記錄的回溯方法如下:建議三個**,分別為左對角線,右對角線,豎直方向。如果有q值記錄在裡面就跳出當前的迴圈,刪除上乙個q值,進行回溯。
這種方式相對與之前的逐個比較就會快很多。
class
solution
:def
solvenqueens
(self, n:
int)
-> list[list[
str]]:
out =
board =[[
"."]
*n for _ in
range
(n)]
defbacktrack
(left_diagonal,right_diagonal,column)
: row =
len(column)
if row == n:
res =
for j in board:
''.join(j)
)return
for col in
range
(n):
if col in column or
(row - col)
in left_diagonal or
(row + col)
in right_diagonal:
continue
board[row]
[col]
='q'
backtrack(left_diagonal +
[row-col]
,right_diagonal +
[row+col]
,column +
[col]
) board[row]
[col]
='.'
backtrack(,,
)return out
之後發現每次都需要計算當前column內的個數作為row的行數,所以考慮結合上面兩種方法,將row代入到回溯函式中去。這樣就不需每次都計算當前的行數值,減少運算。
class
solution
:def
solvenqueens
(self, n:
int)
-> list[list[
str]]:
out =
board =[[
"."]
*n for _ in
range
(n)]
defbacktrack
(board, row:
int,left_diagonal,right_diagonal,column)
:if row == n:
res =
for j in board:
''.join(j)
)return
for col in
range
(n):
if col in column or
(row - col)
in left_diagonal or
(row + col)
in right_diagonal:
continue
board[row]
[col]
='q'
backtrack(board, row+
1,left_diagonal +
[row-col]
,right_diagonal +
[row+col]
,column +
[col]
) board[row]
[col]
='.'
backtrack(board,0,
,[],
)return out
leetcode 面試題 08 12 八皇后
設計一種演算法,列印 n 皇后在 n n 棋盤上的各種擺法,其中每個皇后都不同行 不同列,也不在對角線上。這裡的 對角線 指的是所有的對角線,不只是平分整個棋盤的那兩條對角線。注意 本題相對原題做了擴充套件 示例 輸入 4 輸出 q.q q.q.q.q.q q.解釋 4 皇后問題存在如下兩個不同的解...
leetcode 面試題專題
面試題51.陣列中的逆序對 在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。利用歸併排序,將陣列分成兩部分,前面一部分和後面一部分,進行歸併的時候,需要比較兩個陣列的數值大小,如果第二個陣列的值小的話,代表前乙個陣列剩下的都...
位元組面試題 leetcode
給定乙個迴圈陣列 最後乙個元素的下乙個元素是陣列的第乙個元素 輸出每個元素的下乙個更大元素。數字 x 的下乙個更大的元素是按陣列遍歷順序,這個數字之後的第乙個比它更大的數,這意味著你應該迴圈地搜尋它的下乙個更大的數。如果不存在,則輸出 1。示例 1 輸入 1,2,1 輸出 2,1,2 解釋 第乙個 ...