搜尋此網誌

[C/C++][幻方]

幻方,有時又稱魔方,可參考動畫圖


Source:http://en.wikipedia.org/wiki/File:SiameseMethod.gif

/*
* File Name: MagicSquare.c
* Author: MH
* Since 2013/03/10
* Toolkit: Dev C++ 4.9.9.9
*/

#include <stdio.h>
#define max_n 20

int main(){

    int x[max_n][max_n];
    int i, j, k, n;

    do{
        printf("Enter odd array size (3~19): ");
        scanf("%d", &n);
    }while((n>19) || (!(n%2)) || (n<3));

    // fill zero into array
    for (i=0; i<n; i++)
        for (j=0; j<n; j++)
            x[i][j] = 0;

    // by placing a 1 in the middle location of top row
    i = 0;
    j = (n-1)/2;    // find the central position
    x[i][j] = 1;

    for (k=2; k<=n*n; k++){

        // write successive integers in an upward-right diagonal path;
        i--;
        j++;

        // if the row and column indices all out of bound
        // the next location will be at the second row
        // the (n-1)th column
        if ((i<0) && j>n-1){
            i = 1;    // second row
            j = n-1;    // (n-1)the column
        }

        // if the row index out of bound (i<0)
        // use the maximum row index
        else if (i<0)
            i = n-1;

        // if the column index out of bound (j>n-1)
        // use the minimum column index
        else if (j>(n-1))
            j = 0;

        if (x[i][j]!=0){
            i += 2;
            j--;
        }
        x[i][j] = k;

    }

    for (i=0; i<n; i++){
        for (j=0; j<n; j++){
            printf("%4d", x[i][j]);
        }
        printf("\n");
    }

    return 0;
}

沒有留言:

張貼留言