leetcode 面試題 08 12 八皇后

2021-10-07 16:11:26 字數 3707 閱讀 1620

面試題 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 解釋 第乙個 ...