BE/C++

[C++] 마방진 만들기

콩다영 2023. 11. 9.
728x90

사용자로부터 홀수 n을 입력받아 n*n의 마방진 만들기!

 

3X3 마방진

 

※ 마방진이란 ? 

   : 1에서 n제곱까지의 수를 정사각형으로 배열해 가로, 세로, 대각의 합계가 모두 같도록 만든 것

   [ '마방진' 위키백과 ] 

 

 

 

[ 적용조건 ]

▷ 사용자로부터 홀수 n을 입력받아 n*n의 정사각혀 배열을 만든다.

▷ 1은 첫 행의 가운데에 위치하고, 우상단으로 갈수록 숫자가 1씩 늘어난다.

▷ 우상단으로 이동하는 도중 이미 칸이 채워져 있으면 바로 아래 칸에 다음 숫자가 채워진다.

 

 

첫 번째 행에서 우상단으로 이동할 때는 마지막 행의 다음 열로 이동한다.         ex) 1 → 2로 이동할 때 (빨간색 표시)

마지막 열에서 우상단으로 이동할 때는 첫번째 열의 이전 행으로 이동한다.     ex) 3 → 4로 이동할 때 (파란색 표시)

▷ 첫번째 행의 마지막 열에서는 우상단으로 이동하는 것이 아니라 바로 아래칸으로 이동한다.

 

 

 

실행코드

#include <iostream>
#include <vector>
#include <iomanip>


// 프로젝트. 마방진 만들기

using namespace std;

int main() {
	// 홀수 n입력받아 n*n 마방진 생성.
	int n, row, col;
	int newRow, newCol;

	cout << "마방진의 행 혹은 열의 수를 홀수로 입력해주세요 : ";
	cin >> n;

	if (n % 2 == 0) {
		cout << "홀수만 가능합니다." << endl;
	}
	else {
		vector <vector<int>> mbj(n, vector<int>(n));

		// 1은 첫 행의 가운데 위치.
		row = 0;
		col = (n / 2);
		mbj[row][col] = 1;

		for (int num = 2; num <= n * n; num++) {
			// 우상단으로 숫자 +1씩 늘어남.
			newRow = row - 1;
			newCol = col + 1;
			if (newRow < 0) {
				newRow = n - 1;
			}
			if (newCol > n - 1) {
				newCol = 0;
			}

			if (mbj[newRow][newCol] != 0) {
				row++;
				if (row > n - 1) {
					row = 0;
				}
			}
			else {
				row = newRow;
				col = newCol;
			}
			mbj[row][col] = num;
		}


		// 결과 출력.
		cout << "\n▶ 내가 만든 마방진 ◀" << endl;
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				cout << setw(5) << mbj[i][j];
			}
			cout << endl;
		}
	}
}

 

 

실행결과

5 X 5 마방진
7 X 7 마방진

 

느낀 점

: 마방진 개념을 초등학교였때였나 마지막으로 보고 너무 오랜만에 봐서 프로그램을 구현하기 전에 마방진의 개념을 이해하는데에

더 시간이 걸렸다..^^ 마방진의 개념이 이리 헷갈렸었나 싶었다. ㅎㅎㅎ

그래도 개념을 먼저 이해한 후 어떠한 구조로 마방진의 숫자가 나열되는지 구상하니 더 수월했다 !

 

 

728x90
반응형

댓글