1. 程式人生 > >八皇后(c語言)

八皇后(c語言)

程式碼+解釋說明+心得 (按順序來的

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <math.h>

#include <stdbool.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++,防止越界或者別的。