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語言的人來說,...