八皇后(c語言)
阿新 • • 發佈:2018-12-27
程式碼+解釋說明+心得 (按順序來的)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
int longitudinal[100];
int queen[100][100];
bool place (int); /*找到皇后合適的列位置*/
void Queen (int); /*找到所有皇后合適的位置,並矩陣輸出*/
int main(int argc, char *argv[]) {
int num;
printf ("Please input the number of Queens:\n");
scanf ("%d", &num);
Queen (num);
return EXIT_SUCCESS;
}
/*檢索皇后 Q 放置在 longitudinal[Q] 列是否發生衝突*/
bool place (int Q) {
int i;
for (i = 1; i < Q; i++)
if(longitudinal[Q] == longitudinal[i] || abs(Q-i) == abs(longitudinal[Q] -longitudinal[i]))
return true;
return false;
}
/*回溯,找出所有皇后 Q 合適的位置,並矩陣輸出*/
void Queen(int num) {
int i, j;
int Q = 1;
int ways = 0;
memset (longitudinal, 0, sizeof(int)*num); /*初始化陣列 Q*/
while(Q >= 1) {
longitudinal[Q] = longitudinal[Q] + 1; /*在下一列放置第 Q 個皇后*/
while(longitudinal[Q] <= num && (place(Q))) {
longitudinal[Q] = longitudinal[Q]+1; /*檢索下一列*/
}
if(longitudinal[Q] <= num && (Q == num)) { /*得到一個,則輸出一個*/
ways++;
printf ("\n%d\n", ways);
memset (queen, 0, sizeof(queen)); /*初始化陣列queen*/
for(i = 1; i <= num; i++) { /*若時皇后,則為1,否則,為0*/
for (j = 1; j <= num; j++) {
if (longitudinal[i] == j) {
queen[i][j] = 1;
}
}
}
for (i = 1; i <= num; i++) {
for (j = 1; j <= num; j++)
printf ("%d ", queen[i][j]);
printf ("\n");
}
}
else if (longitudinal[Q] <= num && Q < num) {
Q = Q + 1; /*放置下一個皇后Q+1*/
}
else {
longitudinal[Q] = 0; /*本個皇后位置初始為0,回到上個皇后,向後重新選位(回溯)*/
Q = Q - 1;
}
}
}
解釋說明:此程式碼先用一維陣列Q找到皇后的合適位置,以二維陣列longitudinal形式輸出。先用一維陣列的原因如下:陣列Q的下標相當於時皇后的橫座標,而陣列Q對應的值代表列,如:Q[1]=2,則為把第一個皇后放在第一行,第二列;如果用一維陣列Q來找到皇后位置的話,在函式place中,判斷是否在同行,列,對角線上時,無需判斷是否同行。採用二維陣列longitudinal的形式輸出,更加形象直觀的顯示出所有皇后位置的擺放。
小編心得:在使用memset函式初始化時,注意引數的擺放位置,在初始化二維陣列時,注意,要麼用一重迴圈部分初始化,要麼,不用迴圈,全部初始化,就像小編一樣啦。當時,小編就米有用迴圈,結果直接初始化,結果,輸出不對,等到明白原因時,頓時覺得,原來自己當時撒比的一下,就米有想到呢。下次要注意啦~ 還有就是,要麼從頭到尾用 i=1;i<=n;i++,要麼,就從頭到尾使用i=0;i<n;i++,防止越界或者別的。