八皇后演算法(回溯)

2021-09-12 18:44:40 字數 1298 閱讀 6423

演算法描述: 八皇后是一道很具典型性的題目。它的基本要求是這樣的:在乙個8*8的矩陣上面放置8個物體,乙個矩陣點只允許放置乙個物體,任意兩個點不能在一行上,也不能在一列上,不能在一條左斜線上, 當然也不能在一條右斜線上。

八皇后問題,是乙個古老而著名的問題,是回溯演算法的典型例題。該問題是十九世紀著名的數學家高斯2023年提出:在8x8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法。 高斯認為有76種方案。2023年在柏林的象棋雜誌上不同的作者發表了40種不同的解,後來有人用圖論的方法解出92種結果。計算機發明後,有多種方法可以解決此問題。

演算法分析:陣列left,right,col分別用來標記衝突,

col陣列代表列衝突,從col[0]~col[7]代表第0列到第7列,如果某列上已經有皇后,則為1,否則為0;

right陣列代表主對角線衝突,為right[i-j+7],即從right[0]~right[14],如果某條主對角線上已經有皇后,則為1,否則為0;

陣列left代表從對角線衝突,為left[i+j],即從left[0]~left[14],如果某條從對角線上已經有皇后,則為1,否則為0;

1.初始化

int col[8]=;

int left[15]=;

int right[15]=;

int q[8];//皇后

int cnt=0;//計數器

2.輸出函式

void printf();

for(int k=0;k<8;++k)

for(int k=0;k<8;++k)

printf("\n");

} printf("\n\n");

}

3.queue函式

void queen(int i)

} }

4.下面放出完整**

#include#includeint col[8]=;

int left[15]=;

int right[15]=;

int q[8];

int cnt=0;

void printf();

for(int k=0;k<8;++k)

for(int k=0;k<8;++k)

printf("\n");

} printf("\n\n");

}void queen(int i)

} }int main(void)

回溯演算法 八皇后

總時間限制 1000ms 記憶體限制 65536kb 描述 會下西洋棋的人都很清楚 皇后可以在橫 豎 斜線上不限步數地吃掉其他棋子。如何將8個皇后放在棋盤上 有8 8個方格 使它們誰也不能被吃掉!這就是著名的八皇后問題。對於某個滿足要求的8皇后的擺放方法,定義乙個皇后串a與之對應,即a b 1b2....

回溯演算法 八皇后

今天學習了下回溯演算法,順便看了下經典案例 八皇后問題。該問題是國際西洋棋棋手馬克斯 貝瑟爾於1848年提出 在8 8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。回溯演算法的搜尋邏輯是深度優先,即,從一條路往前走,能進則進,不能進則...

八皇后問題(回溯演算法)

八皇后問題是古老的問題,十八世紀由乙個西洋棋手提出的,即在乙個8 8 的西洋棋盤上,放置八個皇后,使它們不能相互攻擊到。即不能處於同一行,同一列,也不能處於同一條斜線上,問有多少種擺法。八皇后問題是經典的回溯演算法問題,後人利用計算機,算出了8 8 的棋盤上能擺出92種,而後又提出了n皇后問題。本人...