問題描述:
八皇后問題,是乙個古老而著名的問題,是回溯演算法的典型案例:在8x8格的西洋棋棋盤上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法。
問題求解:
採用回溯演算法,即從第一行開始,依次探查可以放置皇后的位置,若找到,則放置皇后,開始探查下一行;若該行沒有位置可以放置皇后,則回溯至上程式設計客棧一行,清除該行放置皇后的資訊,從該行原本放置皇后的下乙個位置開始探查可以放置皇后的位置。求所有解時,每找到一組解,就清除這一組解最後乙個皇后的位置資訊,開始探查該行另外乙個可以放置皇后的位置,依次回溯求解。
儲存結構:
一維陣列:col[8]:存放第i列有無皇后的標記資訊
一維陣列:left[15]:存放每一條左斜線上的有無皇后的標記資訊
一維陣列:right[15]:存放每一條右直線上有無皇后的標記資訊
一維陣列:q[8]:存放第i行的皇后的列下標
**實現:
#include
#define n 8
int col[n] = ;
int right[2 * n - 1] = ;
int left[2 * n - 1] = ;
int q[n];
int cnt = 0;
void print()
printf("\n");
} printf("*************************=\n");
cnt++;
}void queen(int i)
else
col[j] = 0;
right[n - 1 + i - j] = 0;
left[i + j] = 0;程式設計客棧//清除標記,查詢下一組解}}}
int main(void)
執行結果:
一共92組解,前面結果略去。。
本文標題: c語言基於回溯演算法解決八皇后問題的方法
本文位址:
C語言回溯法解八皇后問題 八皇后演算法
在乙個西洋棋棋盤上放置八個皇后,使得任何兩個皇后之間不相互攻擊,求出所有的布棋方法,並推廣到n皇后情況。啥文字都不用看,b站上有個非常詳細的動畫 解說,上鏈結!click here include include include using namespace std void put queen ...
C 基於回溯法解決八皇后問題示例
回溯法的基本做法是搜尋,或是一種組織得井井有條的,能避免不必要搜尋的窮舉式搜尋法。這種方法適用於解一些組合數相當大的問題。回溯法在問題的解空間樹中,按深度優先策略,從根結點出發搜尋解空間樹。演算法搜尋至解空間樹的任意一點時,先判斷該結點是否包含問題的解。如果肯定不包含,則跳過對該結點為根的子樹的搜尋...
回溯演算法 八皇后
總時間限制 1000ms 記憶體限制 65536kb 描述 會下西洋棋的人都很清楚 皇后可以在橫 豎 斜線上不限步數地吃掉其他棋子。如何將8個皇后放在棋盤上 有8 8個方格 使它們誰也不能被吃掉!這就是著名的八皇后問題。對於某個滿足要求的8皇后的擺放方法,定義乙個皇后串a與之對應,即a b 1b2....