본문 바로가기
[Public] 컴퓨터공학/알고리즘

[알고리즘] 4배수 마방진

by 차출발 2009. 5. 13.
반응형

2009. 05. 13 ()



4배수의 마방진이란 n의 값이 4 8 12 같이 4의 배수로 구성된 마방진을 뜻 합니다.

 

 

1.     4배수 마방진 풀이

     1:2:2 의 비율로 가로 세로를 3등분하여 9개 구역으로 나눕니다.

     대각선 방향은 정방향으로 1부터 숫자를 차례대로 대입합니다

     나머지 영역은 끝에서부터 역방향으로 차례대로 기록 합니다.

 

 

2.     소스


#include "stdafx.h"

#include <stdio.h>

 

#define MAXSIZE 10

int g_nSquare[MAXSIZE][MAXSIZE] ={0, };

 

bool IsInBlock(int n, int row, int col);

void GetQuaterSquare(int n);

void InitSquare();

void PrintSquare(int n);

 

int _tmain(int argc, _TCHAR* argv[])

{

        InitSquare();

        GetQuaterSquare(4);

        PrintSquare(4);

 

        InitSquare();

        GetQuaterSquare(8);

        PrintSquare(8);

 

        return 0;

}

 

bool IsInBlock(int n, int row, int col)

{

        int nQuater = 0;

        int nHalf = 0;

 

        nHalf = n /2;

        nQuater = nHalf / 2;

 

        if ((row < nQuater) || (row >= nHalf + nQuater))

        {

               if ((col < nQuater) || (col >= nHalf + nQuater))

               {

                       return true;

               }

        }

       

        if ((row >= nQuater) && (row < nHalf + nQuater))

        {

               if((col >= nQuater) && (col < nHalf + nQuater))

                       return true;

        }

 

        return false;

 

}

 

void GetQuaterSquare(int n)

{

        int row = 0, col = 0;

        int nValue = 1;

 

        for (row=0 ; row<n ; row++)

        {

               for (col = 0 ; col < n ; col++)

               {

                       if(IsInBlock(n, row, col) == true)

                              g_nSquare[row][col] = nValue;

                      

                       nValue++;

               }

        }

 

        nValue = 1;

 

        for (row=n-1 ; row>=0 ; row--)

        {

               for (col = n-1 ; col >= 0 ; col--)

               {

                       if(IsInBlock(n, row, col) == false)

                              g_nSquare[row][col] = nValue;

 

                       nValue++;

               }

        }

 

}

 

void InitSquare()

{

        for (int i= 0 ; i<MAXSIZE ; i++)

        for (int j= 0 ; j<MAXSIZE ; j++)

        {

               g_nSquare[i][j] = 0;

        }

}

void PrintSquare(int n)

{

        for (int i= 0 ; i<n ; i++)

        {

               for (int j= 0 ; j<n ; j++)

               {

                       printf("%d\t", g_nSquare[i][j]);

               }

               printf("\n");

        }

}