日常演算法練習(1)N皇后問題常規題解

2021-10-07 15:00:23 字數 2314 閱讀 9692

1. 在乙個n x n的棋盤上,每行放乙個「皇后」

2. 不能互相攻擊(不在同一直線/對角線上存在)

3. 返回所有解決方案

4. 輸出答案為「皇后」位置為"q"空位置為"."

n x n的棋盤

int

result =

newint

[n][n]

;

驗證位置是否符合「不能互相攻擊」原則

public

boolean

valid

(int row ,

int column ,

int[

] result)

返回所有解決方案,傳統思維就意味著可以試錯,即回溯

public

void

backtrack

(int

result ,

int row ,

int n)

for(

)//回溯

}

將結果輸出為相應格式

public list

fill

(int

result ,

int n)

驗證是否符合原則

要求是不在同一直線/對角線

public

boolean

valid

(int row ,

int column ,

int[

] result)

if(leftup >=

0&& result[i]

[leftup]==1

)if(rightup < result.length && result[i]

[rightup]==1

)//需要根據行來調整左上和右上

leftup--

; rightup++;}

return

true

;}

回溯模組

public

void backtrack (

int[

] result ,

int row ,

int n)

for(

int column =

0; column < n ; column++

) result[row]

[column]=0

;//回溯

}}

輸出結果轉換

public list

fill

(int

result ,

int n)

else

} list.

add(tmp.

tostring()

);}return list;

}

class

solution

public

void backtrack (

int[

] result ,

int row ,

int n)

for(

int column =

0; column < n ; column++

) result[row]

[column]=0

;}}public

boolean

valid

(int row ,

int column ,

int[

] result)

if(leftup >=

0&& result[i]

[leftup]==1

)if(rightup < result.length && result[i]

[rightup]==1

) leftup--

; rightup++;}

return

true;}

public list

fill

(int

result ,

int n)

else

} list.

add(tmp.

tostring()

);}return list;

}}

遊戲1 n皇后問題

nn的矩陣,需要每次選n個選擇,選擇n次,就是乙個數每次都可以使用的全排列問題,但其實不是每次都需要選n次,而是要根據以前的選擇來決定現在可以選什麼。只是限制條件比一般的全排列問題更多。所以先將乙個nn的char表賦值為.然後開始從第一行開始選,就是for迴圈這個陣列,如果這個點符合標準,則遞迴開始...

關於1 n排序問題

我開始不會,多看了劉大大的數書幾遍後,領悟一點。大致的思路是 拿 1 2 3 為例 把每乙個數都做為排頭一次後面的數開始變化排列,比如 1為排頭,2 3 排列。易知 2可作為當前的排頭,後面的數依次是這樣 還沒完 這才1剛剛結束 即一層遞迴結束。後面的就重複上述步驟即可。includeusing n...

演算法 n皇后問題

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