藍橋杯 遞迴回溯 八皇后問題 N皇后問題

2021-08-15 02:44:06 字數 1993 閱讀 4948

大致思路

其實就是三個功能函式: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.在第二行適合的位置 不在上...