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

時間 2021-08-11 15:52:47

1樓:

(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

2樓:

#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)

簡單c語言問題,求教,簡單C語言問題,求教

的優先順序比 高 c a b 2相當於c a b 2 c a 1 c 00000011 單目運算子 算術運算子 移位運算子 關係運算子 邏輯運算子 條件運算子 賦值運算子 逗號運算子 單目運算子 邏輯非運算子 按位取反運算子 字首增量運算子 字首減量運算子 正號運算子 負號運算子 型別 型別轉換運算...

急急急C語言八皇后問題起始位置由鍵盤輸入

八皇后問題作為遞迴的經典例題,不可能真的簡單到哪去,我只能保證我的註釋夠詳細。原始碼已經發了。用c語言解決八皇后問題,要求第一個皇后位置用鍵盤輸入,需要詳細 和解釋,謝謝 5 include stdio.h include math.h int row 8 void arrange int k fo...

關於C語言的問題,求教,一個關於C語言的問題,求教!!

冰雨vs冰霜 a b 是賦值 a b 是等號 這是新手長犯錯誤 c語言中經常犯的毛病!初學者必看!c 語言的最大特點是 功能強 使用方便靈活。c編譯的程式對語法檢查並不象其它高階語言那麼嚴格,這就給程式設計人員留下 靈活的餘地 但還是由於這個靈活給程式的除錯帶來了許多不便,尤其對初學c語言的人來說,...