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

2021-10-17 10:45:00 字數 1906 閱讀 5005

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皇后放置布局,其中 q 和 分別表示乙個女王和乙個空位置。樣例1 輸入 1 輸出 q 樣例2 輸入 4 ...

演算法 n皇后問題

題目描述 乙個 n n 的棋盤,要在上面放 n 個皇后。規則 兩個皇后之間如果是同列 同行 同對角線它們會互相攻擊。也就 是 說 棋盤上的任意兩個皇后不能為同列 同行 同對角線。演算法思想 q j 表示乙個解的空間即儲存一組可行解的陣列,j表示行數,q j 的值表示j行可以放置皇后的所在列數,根據任...

(演算法)N皇后問題

八皇后問題 在8 x 8的西洋棋上擺放八個皇后,使其不能相互攻擊,即任意兩個皇后不得處於同一行,同一列或者同意對角線上,求出所有符合條件的擺法。1 回溯法 資料結構 由於8個皇后不能處在同一行,那麼肯定每個皇后佔據一行,這樣可以定義乙個陣列a 8 陣列中第i個數字,即a i 表示位於第i行的皇后的列...