回溯法(四皇后)

2021-08-14 07:50:59 字數 906 閱讀 1152

回溯法的基本思想:

1.在包含問題的所有解的解空間樹中(解空間:不是所有正解的集合的意思,包含完成一件事的正確部分的意思),按照深度優先搜尋的策略,從根結點出發深度探索解空間樹。

2.當探索到某一結點時,要判斷該結點是否包含問題的解

(a)若包含,就從出發繼續探索下去

(b)若該結點不包含問題的解那就說明以該結點為根結點的子樹一定不包含問題的最終 解因此要跳過以該結點為根的子樹的系統搜尋,逐層向其祖先結點回溯,這個過程叫做「剪枝」操作。

(若求所有解,要回溯到解空間樹的樹根,若解決問題即可,只要搜尋到乙個解就可結束了)

四皇后問題的回溯法

整個解空間樹為一棵四叉的滿樹。

其實,在解決四皇后問題時,並不一定要真的構建出這樣的一棵解空間樹(像堆排序的堆一樣,只是一種思想),完全可以通過乙個遞迴回溯來模擬

程式演算法:

#include"stdio.h"

int count=0; //記錄問題解的個數

//判斷棋盤中q[i][j]的位置是否可以放置乙個皇后

int iscorrect(int i,int j,int (*q)[4])

//核心演算法

void queen(int j,int (*q)[4])

printf("\n");

getche();

count++;

return;

}for(i=0;i<4;i++)

}}main()

演算法分析:

用乙個二維陣列q[4][4]存放棋盤。q[i][j]=0表示該位置不放置皇后,q[i][j]=1表示該位置放置皇后。

得到乙個解後,程式需要返回上一層,所以queen()用指向二維陣列每一行的指標(*q)[4]。

回溯法 皇后

皇后是排列樹,也是 叉樹,排列數要求 n後不在對角線上 叉樹 n後不在對角線上且不在同一列上。n後不在對角線上且不在同一列上。通過畫圖,可以輕易得到 對角線,行差距 列差距 def place self,k for i in range k ifabs k i abs self.solution k...

回溯法 八皇后

題目大意 八皇后問題是乙個以西洋棋為背景的問題 如何能夠在 8 8 的西洋棋棋盤上放置八個皇后,使得任何乙個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行 縱行或斜線上。八皇后問題可以推廣為更一般的n皇后擺放問題 這時棋盤的大小變為n1 n1,而皇后個數也變成n2。而且...

8皇后回溯法

思路 逐行放置,逐列搜尋。從當前行的第一列開始搜尋,判斷該位置是否合法。合法則遞迴判斷下一行,不合法則搜尋下一列,直到最後一列也不符合,或者在最後一行放下棋子就返回上一次遞迴,一直到第一行遍歷完畢。include include include define maxsize 8 char a max...