조선대에서 임베디드 S/W 강의를 들을 때 다음과 같은 3 x 3 크기의  마방진을 만들어 출력하라는 문제가 나왔다.

 816
 35
7
 492

처음에는 가로, 세로, 대각선의 합이 모두 같을 때까지 계속 숫자를 채워나가는 조금 무식한 방법을 써보았는데, 위와 같은 3 x 3 크기의 마방진은 금방 풀리지만, 아래와 같은 5 x 5 크기 이상의 마방진은 쉽게 풀리지 않았다. 이 방법은 마방진의 크기가 커짐에 따라서 푸는 시간이 기하급수적으로 늘어나는 듯 했다.

 1724
1
8
15
 235
7
14
16
 46
13
20
22
101219
21
3
1118
25
2
9

그래서 마방진을 푸는 다른 방법을 찾아보았고, 인터넷 검색을 통해서 Siamese method라는 방법을 알게 되었다.

Siamese method(De la Loubère method)는 모든 홀수 크기의 마방진을 아주 쉽고 간단하게 풀어낼 수 있는 방법이다.


맨 먼저, 마방진의 첫 번째 행 중간을 1로 채운다.
그 다음, 오른쪽 위로 한 칸씩 이동한다. 만약, 마방진 밖으로 벗어나게 된다면, 각각 마방진의 첫 번째 열과 마지막 행으로 이동한다. 그리고 그곳에 다음 숫자를 채운다. 만약, 그곳에 이미 숫자가 채워져 있다면 이전에 숫자를 채워 넣었던 위치에서 아래로 한 칸 이동한 후, 그 곳에 다음 숫자를 채운다.
그 다음, 마방진 내에 모든 숫자를 다 채울 때까지 계속 위의 과정을 반복하면 된다.

이 방법을 C로 구현하면 다음과 같다.

펼쳐두기..


이전 1 ... 21 22 23 24 25 26 27 28 29 ... 45 다음