回溯 棧解決八皇后的問題

2021-06-12 06:28:09 字數 1217 閱讀 1095

1 設計要求與分析

在8*8

的西洋棋棋盤上放置了八個皇后,要求沒有乙個皇后能吃掉另乙個皇后,即任意兩個皇后都不處於棋盤的同一行、同一列或同一對角線上

,這是做出這個課題的基礎。

2.全部程式

// 八皇后 //

#include "stdafx.h"

#include "stdio.h"

#define  true 1

#define  false 0

int irow[9],irightdiagonal[17],ileftdiagonal[17];

int iseqstack[9];

static int index=1;

void queenprint()

void queenmove(int i,int j)

void queensolve()

i=1;j=1;

while (i>=1)

if (j<=8)

else 

}else }}

}int main(int argc, char* argv)

3.演算法求精

全域性變數

int irow[9],irightdiagonal[17],ileftdiagonal[17];

irow[j]為真時,表示

j列上無皇后

irightdiagonal[i+j]為真時,表示「

/」的對角線上無皇后

ileftdiagonal[i-j+9]為真時,表示「

\」的對角線上無皇后

棋盤上的安全點為 irightdiagonal[i+j]&&irow[j]&&ileftdiagonal[i-j+9] 的點,在位置(i,j

)上放置皇后後,把 irightdiagonal[i+j]&&irow[j]&&ileftdiagonal[i-j+9] 置為假。

程式的流程

for (i=2;i<=16;i++)

把所有的位置全設為安全的位置

while (i>=1)

當i一旦減為

0,表示全部的解已找到

while (j<=8)

在第i行找安全點,找到了就跳出,沒找到就接著找

if (j<=8)

else 

當i=8 

時,說明到了第八行,列印全部的解,並且移去最後一行的皇后,再退棧,回到上乙個皇后,再移去這個皇后,再修改棧的位置,再進行回溯

回溯法解決八皇后問題

在西洋棋棋盤上 8 8 放置八個皇后,使得任意兩個皇后之間不能在同一行,同一列,也不能位於同於對角線上。問共有多少種不同的方法,並且指出各種不同的放法。使用回溯法依次假設皇后的位置,當第乙個皇后確定後,尋找下一行的皇后位置,當滿足左上 右上和正上方向無皇后,即矩陣中對應位置都為0,則可以確定皇后位置...

回溯 八皇后問題

八皇后問題 國際西洋棋棋手馬克斯 貝瑟爾於1848年提出 在8 8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。分析 八皇后問題是回溯演算法的典型案例。我想我們在自己做的過程中,是這樣的 是先從 0,0 這個座標開始排放皇后,然後 1...

八皇后問題 回溯

在劉汝佳老師的書中對於8皇后問題的分析 我感覺非常經典 8皇后問題可行的解 92個 一共有3種思考的出發點 從64個格仔中選乙個子集,使得 子集中恰好有8個格仔,且任意兩個選出的格仔都不在同一行,同一列或同一對角線上 這正是子集的列舉問題。然而,64個格仔的子集有264個,太大了,這並不是乙個很好的...