c解決八皇后問題

2021-06-21 05:07:27 字數 1117 閱讀 1870

問題描述:

這是乙個經典的關於組合學的問題:在乙個西洋棋中的的棋盤上放置8個皇后, 為了使其中的任何2個皇后都不能相互「攻擊」,希望尋求8個皇后的安全放置位置。 該問題的不能相互「攻擊」相當於要求任意兩個皇后不能在同一行、同一列或同一斜線上。求解可能的方案及方案數。

思路:一般採用回溯法。

易知,每行肯定有乙個皇后,但是放在哪一列需要查詢。這樣,可以採用回溯法試探。

當某一列找不到合適的位置,那麼上乙個皇后得重新尋找合適的位置,如果還找不到(即,當前給皇后放到最後一列了,還是與之前所有放置好的皇后要不同行要不同列要不同斜線方向),那麼就繼續回溯到上上乙個皇后等等。當回溯到第乙個皇后時,這個皇后如果放到最後一列還是讓其他的皇后沒有位置可以放,那麼就說明放不了,失敗,退出。

如果八個皇后都放好且不衝突,那麼成功,退出。

從(0,0)開始,放第乙個皇后,剩下的七個皇后怎麼放?

如下**計算出第一種解法:

#include "stdio.h"

#include "stdlib.h"

#define lines 8 // 定義行數

#define cols 8 // 定義列數

void visit(int q[lines])

{ int i=0;

printf("the result of eight queen: \n");

while(i0)

{find = 0;//find標誌,表示

for(i=0; i < cols; i++)

{q[k]++ ;

if((q[k]

int eightqueen(int q[lines])

{ int k = 1,i,find,temp,count = 0;

q[0] = 0;

while(k>=0)//為了使求解下一輪解法時,仍在此迴圈中,故k可以取0

{find = 0;

for(i=0; i < cols; i++)

{q[k]++ ;

if((q[k]=0),這時」(find == 1)//第k+1個皇后找到合適的"不滿足,這樣會執行else,即又重新把q[k]賦值為-1,直到從某個皇后開始,換一列仍有合適的解法,程式又開始執行查詢下乙個皇后。

C 解決八皇后問題

直接上 可以自己慢慢研究 include include using namespace std int linenum 9 第i列的皇后要放的行位置 只用其中的列號1到8 bool a 9 a i 為1表示第i行上尚未放皇后 bool b 15 b i 為1表示第i條斜對角線上尚未放皇后 斜對角線...

C陣列解決八皇后問題

引用這首詩為了引出乙個演算法,叫做回溯法.什麼是回溯,通俗的解釋就是當你發現自己當初的選擇是錯誤的時候,用時光機把你送回到做選擇的那一天,讓你重來一次.想一想如果高考時給你這樣的福利,豈不是美滋滋?一下關於八皇后的解法,就是利用了回溯法.首先做乙個最簡單的說明,因為八個皇后互相之間都攻擊不到,即不能...

C語言解決八皇后問題

八皇后問題是這樣乙個問題 將八個皇后擺在一張8 8的西洋棋棋盤上,使每個皇后都無法吃掉別的皇后,即 每一行,每一列,每一條對角線只有乙個皇后,一共有多少種擺法?演算法思想 首先逐行遍歷,設定queen max 陣列記錄縱座標 max為格仔數8 每次落子前判斷座標 i,queen i 是否滿足條件,用...