首先介紹一下八皇后的問題。這是乙個古老而著名的問題,指的是在乙個8x8的西洋棋棋盤上,有八個皇后,每個皇后佔乙個;要求皇后之間不會出現相互攻擊的現象,即不能有兩個皇后處在同一行、同一列或同一對角線上。問乙個有多少種不同的排列方法?
下面是**:
#includeusing namespace std;
static int geightqueen[8] = , gcount = 0;
void print()//輸出每一種情況下棋盤中皇后的擺放情況
cout << "*************************=\n";
}int check_pos_valid(int loop, int value)//檢查是否存在有多個皇后在同一行/列/對角線的情況
return 1;
}void eight_queen(int row)
eight_queen(row + 1);
geightqueen[row] = 0;}}
}int main(int argc, char*argv)
鑑於這個演算法稍微有那麼點複雜,我就來分析一下這個演算法的實現過程。首先這個演算法用的是回溯法,它是一種搜尋問題的解方法,有關更具體的回溯法的思想,我就不廢話了,有新的同學去google吧!下面開始講解:
首先說明一下eight_queue函式是測試row行皇后的位置,然後再呼叫check_pos_valid函式測試這個位置是不是滿足題意,check_pos_valid函式的引數第乙個是當下這個皇后的行座標,第二個引數是縱座標,然後和以前的皇后一一對比,當再同一列和同一行的情況就是:
if (value == data)
return 0;
當位於對角線時的情況是下面的兩種:
if ((index + data) == (row + value))
return 0;
if ((index - data) == (row - value))
return 0;
你們可以再紙上自己畫一下看看是不是這個規律分別是:當在最上角到右下角的對角線上時規律是行號減去行號等於列號減去列號,當是右上角到左下角的對角線上時,本身的行號和列號相加等於對角線上另乙個元素的行號加上列號。好了,這個函式分析完畢,然後我們分析eight_queue函式,這個是重點,也是不好理解的地方。
首先對於第一行的皇后的位置置為0(eeightqueue[row]=i表示皇后再第row行的第i列),然後進入上面的函式,判斷是否符合規範,是的話,row+1,進行下一行位置的選定和判斷,別忘了這是用的遞迴。重點來了,當row到達最後一行時,這是row=7,然後總方法變數+1,讓row=7的皇后位置設為0,進行return回退,回到前一行,並且也將前一行的位置設為0.這便是回退的思想,就是這樣,一步一步回退,一直回到最初的第一行,這邊是把整個情況全部遍歷了一遍,得到了總方法。其中if語句的內容是非常重要的,要多看即便你們。雖然這種方法簡單好用,但是對於小資料還行,當資料很大時,變會產生很大的時間複雜度。最後要想公升級快,每天多打怪!!!
八皇后的問題
八皇后的問題和馬踏棋盤的思路是一樣,都用到了回溯的思想。也都差不多。這個裡面最精彩的地方用4個一位陣列表示了這個棋盤。這個裡面總共有92組解 展示 include includeint col 8 int right 15 int left 15 int queen 8 int cnt 全域性變數 ...
八皇后問題
八皇后問題 ackarlix 八皇后問題是乙個古老而著名的問題,是回溯演算法的典型例題。該問題是十九世紀著名的數學家高斯 1850 年提出 在 8x8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。高斯認為有 76種方案。1854 年在...
八皇后問題
include iostream.h int a 8 8 棋盤 int r 8 結果 int i,j int count 0 void init i j 0 int judge int x,int y for int mi x 1,mj y mi 1 mi for int ri x 1,rj y 1...