八皇后問題遞迴解法求注釋,看不懂

2022-04-11 16:42:52 字數 2301 閱讀 2267

1樓:潮炫的咖啡色

#include

int count;//用於統計當前是第幾種情況int queen[10];//用於儲存當前列的第幾行有皇后int column[20];//判斷同列是否有皇后int left[20];//從左上至右下判斷是否有皇后int right[20];//從右上至左下判斷是否有皇后void prt1()//負責列印

void try1(int i)//i表示每行,j表示每列 }} void main()

2樓:匿名使用者

1、因為8個皇后既不能在同一行,也不能在同一列,另外,皇后還同時攻擊兩條正負45度的對角線,因此這幾個陣列是標誌陣列,用來標誌已經放下了皇后的行、列、主對角、次對角線的,後面放下的皇后就要避開才行

2、設其行列下標分別為i,j,為了判斷是否處於同一條主對角線:有i1-j1 = i2-j2

如果是次對角線有:i1+ j1= i2+j2由於i, j 的範圍從1到8,因此i+j 的範圍就是從2到16,i-j的範圍就是從-7到7,於是...

3樓:

if (column[j] && left[i-j+8] && right[i+j]) //根據這三個判斷 得出次三個陣列的作用

for (i=1;i<=16;i++) //作用是賦初值 但是right[i+j]中的 i+j 是有可能超過8的 保險 並且留有餘地

八皇后遞迴演算法 求解空間複雜度

4樓:聽不清啊

在這裡,空間複雜度並不大。因為每遞迴一層,只是增加乙個形式變數的空間,以及遞迴返回位址的開銷。而且在八皇后問題來說,遞迴深度最大為9層。

若是n皇后問題,則空間複雜度也僅是o(n),且係數挺小的。所以說,在這裡空間複雜度不是乙個大的問題。

求教c語言回溯法寫出八皇后問題的92種解

5樓:

(1)全排列

將自然數1~n進行排列,共形成n!中排列方式,叫做全排列。

例如3的全排列是:1/2/3、1/3/2、2/1/3、2/3/1、3/1/2、3/2/1,共3!=6種。

(2)8皇后(或者n皇后)

保證8個皇后不能互相攻擊,即保證每一橫行、每一豎行、每一斜行最多乙個皇后。

我們撇開第三個條件,如果每一橫行、每一豎行都只有乙個皇后。

將8*8棋盤標上座標。我們討論其中的一種解法:

- - - - - - - q

- - - q - - - -

q - - - - - - -

- - q - - - - -

- - - - - q - -

- q - - - - - -

- - - - - - q -

- - - - q - - -

如果用座標表示就是:(1,8) (2,4) (3,1) (4,3) (5,6) (6,2) (7,7) (8,5)

將橫座標按次序排列,縱座標就是8/4/1/3/6/2/7/5。這就是1~8的乙個全排列。

我們將1~8的全排列存入輸入a中(a[0]~a[7]),然後8個皇后的座標就是(i+1,a[i]),其中i為0~7。

這樣就能保證任意兩個不會同一行、同一列了。

置於斜行,你知道的,兩個點之間連線的斜率絕對值為1或者-1即為同一斜行,充要條件是|x1-x2|=|y1-y2|(兩個點的座標為(x1,y1)(x2,y2))。我們在輸出的時候進行判斷,任意兩個點如果滿足上述等式,則判為失敗,不輸出。

下面附上**:新增必要的注釋,其中全排列的實現看看注釋應該可以看懂:

#include

#include

#include

#include

int printed;

//該函式用於畫圖,這裡為了節約空間則略去

//讀者只需要將draw(a,k);去掉注釋即可畫圖

void draw(int* a,int k)

{int i,j;

for(i=0;i

6樓:

#include

#include

#define max 8

int queen[max],sum=0;

void show()

printf(")\n");

++sum;

}int place(int n) //阻止max個皇后在同一列和同一對角線上

}return 1;

}void nqueens(int n)

else}}

}int main(void)

關於八皇后問題,什麼是 八皇后問題 呀

八皇后問題是乙個古老而著名的問題,是回溯演算法的典型例題。該問題是十九世紀著名的數學家高斯1850年提出 在8x8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。高斯認為有76種方案。1854年在柏林的象棋雜誌上不同的作者發表了40種不...

問個關於遞迴的問題

我對pascal語言了解不太多,所以回答的可能有點問題,湊合著看吧,呵呵 第一題 map dep,y true 是執行原來的y值,因為search 的引數為形參,是傳值的,所以函式結束後不會改變引數的值,第二題 二叉樹的pascal語言表示我沒看過,就淺淺的分析一下吧,當t 2時,執行t t 2,就...

php關於通過遞迴函式顯示所有分類的問題

首先需要搞明白你的資料庫結構,你的檔案類別資料庫表 dangan class 是不是三欄位 id name f id,其中id為主鍵,f id為自關聯的外來鍵,表示上一分類,0表示最上級分類,對不對?樹狀列舉出所有類別的 可以這樣 function zilei fid,level mysql fre...