본문 바로가기
C

[C][2차원 배열]홀수 마방진

by Junk_Seo 2018. 1. 2.
반응형

마방진

마방진은 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