반응형
마방진
마방진은 n2개의 수를 가로, 세로, 대각선 방향의 수를 더하면 모두 같은 값이 나오도록 n × n행렬에 배열한 것이다.
n이 2일 때를 제외하고 항상 존재한다.
각 행의 합과 각 열의 합, 그리고 각 대각선의 합 M은 n에만 관계가 있고, 이 값은 다음과 같다.
M(n) = (n3+n)/2
홀수 마방진
마방진에는 n이 홀수인 경우와 짝수인 경우로 나뉜다. 짝수의 경우 홀수의 경우보다 좀 더 복잡하다.
여기서는 홀수 마방진의 경우만 고려한다.
규칙
1. 행렬(2차원 배열)의 첫 번째 행, 가운데 열의 위치에서 시작한다.
2. 다음 숫자를 대각선 방향으로 오른쪽 위 칸에 넣는다.
2-1. 열의 범위를 벗어난 경우 열의 처음으로 이동한다.
2-2. 행의 범위를 벗어난 경우 행의 마지막으로 이동한다.
2-3. 대각선의 위치에 값이 존재하는 경우 행의 바로 아래로 이동한다.
3. 2의 결과를 계속 반복한다.
위의 규칙을 통해 마방진을 형성하면 한 가지 규칙을 찾을 수 있다.
n의 수만큼 대각선 이동을 통해 값이 세팅되고 그 바로 다음에 행의 바로 아래로 이동하여 값이 세팅되면서 다시 대각선 방향으로 이동하는 규칙이다.
이런 규칙을 통해 코드로 표현하면 다음과 같다.
<코드>
int arData[5][5] = {};
int nX = 0;
int nY = 0;
int nData = 0;
int nPivot = 0;
nX = 2;
nY = 0;
nData = 1;
nPivot = 4;
for (int i = 0; i < 5; i++) {
for (int j = 0; j < nPivot; j++) {
arData[nY][nX] = nData;
nData++;
nX++;
nY--;
if (nX > 4) {
nX = 0;
}
if (nY < 0) {
nY = 4;
}
}
arData[nY][nX] = nData++;
nY++;
}
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
printf("%2d ", arData[i][j]);
}
printf("\n");
}
반응형
'C' 카테고리의 다른 글
[C/C++][함수]반환형 (0) | 2018.01.08 |
---|---|
[C][2차원배열]달팽이 배열 (0) | 2018.01.02 |
[C][2차원배열] 지그재그 초기화 (0) | 2018.01.01 |
[C][배열] Index 변수 (0) | 2018.01.01 |
[C][배열] indexing 프로그래밍 (0) | 2018.01.01 |