八皇后問題,是回溯演算法
的典型案例。該問題是國際西洋棋棋手馬克斯·貝瑟爾於2023年提出:在8x8格的西洋棋
上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法。高斯認為有76種方案。2023年在柏林
的象棋雜誌上不同的作者發表了40種不同的解,後來有人用圖論的方法解出92種結果。
八皇后問題往往還需要使用遞迴。
lz查詢到幾種不同的解決方案,現列出其中兩種並做了必要注釋,僅供參考。
第一種:
1 #include 2 #include 3#define n 845
int column[n+1]; //
同欄是否有queen,1表示有
6int rup[2*n+1]; //
右上至左下是否有queen,1表示有
7int lup[2*n+1]; //
左上至右下是否有queen,1表示有
8int queen[n+1] = ;
9int num; //不同解的
編號10
11void
showanswer()
23else
2427
}28 printf("\n"
);29}30
}3132void backtrack(int i) //
遞迴求解
3340
else
4154}55
}56}57
58int main(void
)
第二種:
1 #include 2 #include 34#define queens 856
int icount = 0; //
記錄解的序號
7int site[queens]; //queen
在各行上的位置
8void queen(int n); //
遞迴求解
9void output(); //
輸出乙個解
10int isvalid(int n); //
判斷第n個queen放上去之後是否有衝突
1112
void
main()
1316
17void queen(int
n) 18
2526for(i = 1 ; i <= queens ; i++) //
n還沒到8,在第n行的各個行上依次試探
2733}34
35int isvalid(int n) //
判斷函式
36
46return
1; //
沒有衝突則返回147}
4849
void
output()
50
八皇后的兩種解法
public class eightqueue return true 遞迴解法 public int cal int i if x i 8 i 8 遞迴到了最後乙個地方 尋找到了合適位置,向下一列尋找位置 else if i 8 x i 8 else 非遞迴解法 public int calcul...
python八皇后問題2種解法
八皇后問題 思路 確保每乙個皇后的左上角 右上角或正上方沒有皇后,用這個規則遞迴地每一行,再每一列迴圈過去,每一列或每一行只有乙個元素 from tkinter import from pil import image,imagetk size 8class eightqueen def init ...
八皇后問題的兩種解決方法
最近看到遞迴,原本利用回溯思想解決的經典八皇后問題,其實也是可以用遞迴解決的 八皇后的遞迴解決思路 從第一行開始,依次判斷0 8列的哪一列可以放置queen,這樣就確定了該行的queen的位置,然後行數遞增,繼而遞迴實現下一行的判斷,依次類推直到行數增加到8 行數從0開始的 此時為遞迴 歸的條件,即...