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行可以放置皇后的所在列數,根據任...