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...