大致思路:
其實就是三個功能函式:place attack output_solution
place函式中的任務就是把所有的(設為有maxqueen個)皇后的列位置安頓好。其傳入的引數僅乙個,為皇后的序數q,然後經過i從1~maxqueen的遍歷找到該序數q的皇后應在的列數號,使queen[q]=i,條件就是attack(q,i)==false。(那麼該皇后的行數號呢?這個要理解,皇后的行數號即其序數號,即q。) 設好列數號之後判斷一下是否q==maxqueen-1也就是最後乙個皇后放好了,若是,則呼叫output_solution輸出該最終棋盤布局。
attack函式就是判斷皇后衝不衝突的。其實就是判斷在他(q)之前放好的皇后的列數和q的列數(queen[q])相不相等,然後看看是不是在同一對角線上。
output_solution就是輸出最終的棋盤布局。/**
* 【問題描述】在乙個8×8的西洋棋棋盤上放置8個皇后,
* 要求每個皇后兩兩之間不「衝突」,即沒有乙個皇后能「吃
* 掉」任何其他乙個皇后,簡單的說就是沒有任何兩個皇后
* 佔據棋盤上的同一行或同一列或同一對角線,即在每一橫
* 列、豎列、斜列都只有乙個皇后。
** 遞迴法求出8個皇后問題的解
* 本程式使用一維陣列表示皇后的位置,queen[i]的值表示第i行皇后所在的列
** 本程式通過修改巨集定義maxqueen的值,可以解決n皇后問題。**/
#include
#include
#define true 1
#define false 0
#define maxqueen 8
#define abs(x) ((x>0)?(x):-(x)) /*求x的絕對值*/
/*存放8個皇后的列位置,陣列下標為皇后的列位置*/
intqueen[maxqueen];
inttotal_solution = 0;
/*計算共有幾組解*/
/*函式原型宣告*/
void
place(
int);
intattack(
int,
int);
void
output_solution();
intmain(
void
)
/* 遞迴放置皇后子程式 */
void
place(
intq) //關鍵!
i++;
} }
/* 測試在(row,col)上的皇后是否遭受攻擊若遭受攻擊則返回值為1,否則返回0 */
intattack(
introw,
intcol)
return
atk;
} /* 輸出8個皇后的解 */
void
output_solution()
printf("\n"
);
getchar();
} 自己現寫的**如下:
#include#includeusing namespace std;
int q[9];
int maxx=0;
int a[9][9];
bool attack(int p,int qq)
return
atk;
} /* 遞迴放置皇后子程式 */
void
place(
intq,
intn)
i++;
} }
intmain(
void
)
while
(scanf(
"%d"
, &n) != eof)
return
0;
}
八皇后問題(遞迴,回溯)
八皇后問題是乙個以西洋棋為背景的問題 如何能夠在 8 8 的西洋棋棋盤上放置八個皇后,使得任何乙個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行 縱行或斜線上。八皇后問題可以推廣為更一般的n皇后擺放問題 這時棋盤的大小變為n n,而皇后個數也變成n。當且僅當 n 1 或...
遞迴 回溯 八皇后問題
八皇后 問題,是乙個古老而著名的問題,是回溯演算法 的典型案例。該問題是國際西洋棋棋手馬克斯 貝瑟爾於1848年提出 在8 8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法.輸入 無 輸出 8行8列的矩陣,0代表此處無皇后,1表示此處有...
遞迴回溯 八皇后問題
八皇后問題 西洋棋中皇后能橫向,縱向和斜向移動,在這三條線上的其他棋子都可以被吃掉。所謂八皇后問題就是 將八位皇后放在一張8x8的棋盤上,使得每位皇后都無法吃掉別的皇后,即任意兩個皇后都不在同一條橫線,豎線和斜線上 問一共有多少種擺法?解決思路 1.將第一行第一列放入 2.在第二行適合的位置 不在上...