問題描述:
這是乙個經典的關於組合學的問題:在乙個西洋棋中的的棋盤上放置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 是否滿足條件,用...