/ 알고리즘

홀수 마방진

알고리즘 배열 홀수 마방진
https://4am.kr/-ed-99-80-ec-88-98--eb-a7-88-eb-b0-a9-ec-a7-84/

프로그램 명: magic

제한시간: 1 초
마방진(magic square)이란 가로,세로, 대각선의 합이 같은 사각형을 말한다.

홀수 n 을 입력으로 받아 n * n 홀수 마방진을 구하고자 한다.

구현 방법은

  • 시작은 첫행 , 중간열 에서 1 을 두고
  • 행을 감소, 열을 증가하면서 순차적으로 수를 넣어간다.

예외처리 두 가지

  • 행을 감소하므로 행이 첫 행보다 작아지는 경우는 행을 마지막 행으로 두고 , 열은 증가하므로 열이 끝 열을 넘어가는 경우 열은 첫 열로 맞추어 준다.
  • 테이블에 들어간 수가 n 의 배수이면 행만 증가(열은 그대로)

홀수 마방진을 만드는 다른 방법이 있지만 이차원 행,열을 익히는 의미의 문제이니 이 방법대로만 출력

입력

n 은 10 이하의 홀수이다.

출력

각 수는 3 자리 확보후 오른쪽에 맞추어 출력한다.

입출력 예

입력 3 출력 8 1 6 3 5 7 4 9 2

출력 보충

공백이 . 이라면

..8..1..6 ..3..5..7 ..4..9..2

출처:

#include <iostream>
using namespace std;
int main()
{
    int n = 0;
    int magic[11][11];
    //시작은 첫행 , 중간열 에서 1 을 두고
    int nm = 1;
    int row = 0;
    cin >> n;
    int col = n / 2;
    //배열 초기화
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            magic[i][j];
    //입력
    while (nm <= n * n) {
        //시작은 첫행 , 중간열 에서 1 을 두고
        magic[row][col] = nm;
        //테이블에 들어간 수가 n 의 배수이면 행만 증가(열은 그대로)
        if (nm % n == 0)
            row++;
        //행을 감소, 열을 증가하면서 순차적으로 수를 넣어간다.
        else {
            row--;
            col++;
        }
        // 행을 감소하므로 행이 첫 행보다 작아지는 경우는 행을 마지막 행으로 두고
        // 열은 증가하므로 열이 끝 열을 넘어가는 경우 열은 첫 열로 맞추어 준다.
        if (row < 0)
            row = n - 1;
        if (col >= n)
            col = 0;
        if (col < 0)
            col = n - 1;
        if (row >= n)
            row = 0;
        nm++;
    }
    //배열 출력
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            cout.width(3);
            cout << magic[i][j];
        }
        cout << endl;
    }
    return 0;
}