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

2021-07-30 12:51:39 字數 1344 閱讀 6339

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語言的問題,求教!!

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

簡單C語言問題,求教?關於fopen函式

引數說明 引數path字串包含欲開啟的檔案路徑及檔名,引數mode字串則代表著流形態。mode有下列幾種形態字串 r 以只讀方式開啟檔案,該檔案必須存在。r 以可讀寫方式開啟檔案,該檔案必須存在。rb 讀寫開啟一個二進位制檔案,允許讀資料。rw 讀寫開啟一個文字檔案,允許讀和寫。w 開啟只寫檔案,若...

馬上要考C語言了,求教大神 問題有下 1 C語言中 376 為什麼代表圖形字元

376 是8進位制數。超出普通ascii碼範圍的碼,顯示什麼同 系統有關 顯示窗的設定 t 跳一次,等於按了1次tab 鍵。t t 等於按了2次tab 鍵。跳二次。b b 等於按了2次 backspace鍵。刪去前2個字元。得到的結果是float型或者是double,小數點後不一定要寫6位。如果 1...