八皇后問題是乙個古老而著名的問題,是回溯演算法的典型例題。該問題是十九世紀著名的數學家高斯2023年提出:在8x8格的西洋棋上擺放八個皇后(棋子),使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上。
很容易想到用dfs來進行解題,關鍵在於思考如何對列、從左上到右下、從右上到左下的對角線進行標記。
對於列的標記很簡單,那麼如何對對角線進行標記呢?
其實對於一條從右上到左下的對角線,其上的棋子座標應滿足x+y為一定值;
對於一條從左上到右下的對角線,其上的棋子座標應滿足x-y為一定值,為了避免負數的產生,**中用x-y+n來儲存數字,具體效果讀者可以自行研究。
因為一條對角線上的棋子座標經過運算後都可以得到乙個確定值,所以我們就可以採用兩個一維陣列,分別標記兩種對角線。
核心**如下:
1void dfs(int i) //
i表示當前行數28
for(int j =1;j<=n;j++) //
遍歷每一列923
}24 }
備註:其中a陣列表示行,b陣列表示列,c陣列表示從從左上到右下的對角線,d陣列表示從右上到左下的對角線。
經典遞迴問題 八皇后
八皇后問題,是乙個古老而著名的問題,是回溯演算法的典型案例。該問題是國際西洋棋棋手馬克斯 貝瑟爾於1848年提出 在8x8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。解題思路 在這之前我們要明確遞迴求解其實是分成兩個部分的 遞迴回朔...
DFS經典 八皇后問題
題目 題解 check 0 i 標記列 check 1 line i 標記斜向上的對角線,對於同一條這個方向得對角線行列和相同 check 2 line i n 標記斜向下的對角線,對於同一條這個方向得對角線行列差相同但是可能是負數,所以加上n使其恒為正數 解法一 遞迴解法 includeusing...
經典問題之八皇后問題
八皇后問題是乙個以西洋棋為背景的問題 如何能夠在 8 8 的西洋棋棋盤上放置八個皇后,使得任何乙個皇后都無法直接吃掉其他的皇后,為了達到此目的,任兩個皇后都不能處於同一條橫行 縱行或斜線上。我們先來考慮,某個位置是否能夠放皇后,如下圖 兩個皇后的位置是 1,1 2,3 那麼接下來的第三個皇后該怎麼放...