728x90
사용자로부터 홀수 n을 입력받아 n*n의 마방진 만들기!
※ 마방진이란 ?
: 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;
}
}
}
실행결과
느낀 점
: 마방진 개념을 초등학교였때였나 마지막으로 보고 너무 오랜만에 봐서 프로그램을 구현하기 전에 마방진의 개념을 이해하는데에
더 시간이 걸렸다..^^ 마방진의 개념이 이리 헷갈렸었나 싶었다. ㅎㅎㅎ
그래도 개념을 먼저 이해한 후 어떠한 구조로 마방진의 숫자가 나열되는지 구상하니 더 수월했다 !
728x90
반응형
'BE > C++' 카테고리의 다른 글
[C++] 숫자 야구 게임 ( 랜덤숫자 3개로 Strike, Ball ) (1) | 2023.11.09 |
---|---|
[C++] 배열을 이용한 로또당첨 숫자 맞추기 (2) | 2023.10.26 |
[C++] 타임어택 끝말잇기 게임 (0) | 2023.10.26 |
[C++] 랜덤함수를 이용한 베스킨라빈스31 게임 (0) | 2023.10.26 |
[C++] dynamic_cast (타입 캐스트 연산자) (0) | 2023.09.15 |
댓글