寒假歸來,繼續征程。繼續總結這系列經典的遊戲演算法。
問題描述:
八皇后是個古老而有趣的遊戲,是由高斯於2023年首先提出的。要求在西洋棋的棋盤上放置八個皇后,使其不能相互攻擊,即任意兩個皇后不能處於棋盤的同一行、同一列和同一條對角線上。試問有多少種放法?
基本思想:
關於八皇后的演算法有很多,但我認為最好理解的還是回溯法。先把皇后放在(0,0)位置,然後把1號皇后放在(1,j)位置,使其滿足要求。接著放2號皇后,依此類推。遇到某個皇后如把她無論放在該行的任意位置均不滿足要求,則前乙個皇后放置不當,須重新放置前一皇后,8個皇后均按要求放置好,這就是一次成功的擺法。
函式說明:
bool place(int); //判斷能否放置皇后,可以返回true,否則返回false,
void backtrack(int); //回溯法求解放置過程
void print(); //列印最終的解
具體步驟:
place函式中判斷能否放置皇后的條件為:不同列:x[j]!=x[k],不同斜線:abs(k-j)!=abs(x[k]-x[j]),x[i]表示第i個皇后放置在第x[i]列;
backtrack函式中,不斷回溯,依次按序擺放皇后,如果可以放置則擺放下乙個皇后否則將皇后放置到下一位置,若回溯完畢則輸出結果。
c++**實現:
經典演算法之八皇后問題
問題描述 八皇后問題是乙個以西洋棋為背景的問題 如何能夠在 8 8 的西洋棋棋盤上放置八個皇后,使得任何乙個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行 縱行或斜線上。下面利用回溯法 遞迴寫法 來求出所有可能的結果 include include include in...
C C 回溯經典演算法之 八皇后問題
八皇后問題,是乙個古老而著名的問題,是回溯演算法的典型案例。該問題是國際西洋棋棋手馬克斯 貝瑟爾於1848年提出 在8 8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。高斯認為有76種方案。1854年在柏林的象棋雜誌上不同的作者發表了...
經典題型之回溯演算法 八皇后問題
include 判斷能不能在cnt行第col列擺放乙個皇后 能返回1 不能返回0 int judge int queens size t n,size t row,size t col return1 當前位置無威脅,返回1 輸出當前擺法的8個皇后的位置 void show int queens s...