八皇后時間複雜度 九章演算法 N皇后問題

2021-10-12 04:33:31 字數 1906 閱讀 2034

n皇后問題是將n個皇后放置在n*n的棋盤上,皇后彼此之間不能相互攻擊(任意兩個皇后不能位於同一行,同一列,同一斜線)。

給定乙個整數n,返回所有不同的n皇后問題的解決方案。

每個解決方案包含乙個明確的n皇后放置布局,其中「q」和「.」分別表示乙個女王和乙個空位置。

樣例1:

輸入:1 

輸出: [["q"]]

樣例2:

輸入:4

輸出:[

// solution 1

[".q..",

"...q",

"q...",

"..q."

],// solution 2

["..q.",

"q...",

"...q",

".q.."

]]

演算法:dfs(回溯法)題目分析這個問題要求把n個皇后放在乙個nxn的棋盤上,使得任何兩個皇后都不能相互攻擊,即它們不能同行,不能同列,也不能位於同一條對角線上。對於n=1,問題的解很簡單,而且很容易看出對於n=2和n=3來說,這個問題是無解的。所以我們考慮4皇后問題,並用回溯法對它求解。

演算法思路

從空棋盤開始,然後把皇后1 放到它所在行的第-乙個可能位置上,也就是第一-行第一列。對於皇后2,在經過第-列和第二列的失敗嘗試之後,我們把它放在第乙個可能的位置,就是格仔(2, 3),位於第二行第三列的格仔。這被證明是乙個死胡同,因為皇后3將沒有位置可放。所以,該演算法進行回溯,把皇后2放在下乙個可能位置(2,4)上。這樣皇后3就可以放在(3, 2),這被證明是另乙個死胡同。該演算法然後就回溯到底,把皇后1移到(1,2)。 接著皇后2到(2,4), 皇后3到(3,1), 而皇后4到(4, 3), 這就是該問題的乙個解。

**思路

複雜度分析

class solution 

search(results, new arraylist(), n);

return results;

}// search函式為搜尋函式,n表示已經放置了n個皇后,cols 表示每個皇后所在的列

private void search(list> results, listcols, int n)

// 列舉當前皇后放置的列,若不合法則跳過

for (int colindex = 0; colindex < n; colindex++)

// 若合法則遞迴列舉下一行的皇后

cols.add(colindex);

search(results, cols, n);

cols.remove(cols.size() - 1);}}

// isvalid函式為合法性判斷函式

private boolean isvalid(listcols, int col)

if (row + col == rowindex + cols.get(rowindex))

if (row - col == rowindex - cols.get(rowindex))

}return true;

}// draw函式為將 cols 陣列轉換為答案的繪製函式

private listdraw(listcols)

result.add(sb.tostring());

}return result;}}

八皇后時間複雜度 回溯 N皇后問題

在n n格的棋盤上放置彼此不受攻擊的n個皇后。由於皇后可以攻擊與之處於同一行或同一列或在同一斜線上的棋子。n皇后問題等價於在n n的棋盤上放置n個皇后,任何兩個皇后不放在同一列或同一行或同一斜線上。解法分析 最粗暴的做法是每一行遍歷列,然後每次和前面的所有元素判斷一下是不是互相攻擊。複雜度太高。df...

八皇后時間複雜度 n皇后 遞迴思想之解決多重迴圈

n皇后 遞迴思想之解決多重迴圈 圖一 8皇后問題 通過題目我們可以很明顯的發現,每行有且只有乙個皇后,這樣我們就可以採用乙個一維陣列表示n個皇后在棋盤上的擺放位置 例如a 1 2,表示第一行的皇后擺放在第二列 這樣我們就可以假設,已經有k個皇后無錯的擺放好了,現在我們需要對k 1行的皇后進行放置,如...

n皇后問題c語言 九章演算法 N皇后問題

n皇后問題是將n個皇后放置在n n的棋盤上,皇后彼此之間不能相互攻擊 任意兩個皇后不能位於同一行,同一列,同一斜線 給定乙個整數n,返回所有不同的n皇后問題的解決方案。每個解決方案包含乙個明確的n皇后放置布局,其中 q 和 分別表示乙個女王和乙個空位置。樣例1 輸入 1 輸出 q 樣例2 輸入 4 ...