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個,太大了,這並不是乙個很好的...