You cannot see this page without javascript.

Magic Square (마방진) - 홀수

Programing 조회 수 174 추천 수 0 2016.07.15 09:11:59

홀수 마방진에 대해서 알아보자.

완성과정은 크게 두가지 정도가 생각이 난다.

먼저 방진을 확장하여 위치이동 시키는 방법과 어떤 규칙적인 순서에 따라 칸을 이동하면서 채워 나가는 방법으로 두가지 정도가 생각이 난다.

위에서 언급한 방법들에 대하여 해법을 알아보자.

 

1. 확장방진의 위치이동 방법

3차 방진을 보자.

 

 

 

 

 

 

 

 

 

 

 ->

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

이 방진에서 상하좌우로 보조방진을 만든다.

위의 표에서 알수 있듯이 빨간 태두리는 본 방진이고 상하좌우로 증설된 것이 보조방진이다.

 

이대로 넘어가기에 이해가 잘 가지 않을 수 도 있어 5차마방진의 예도 알아보자.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 ->

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

위의 5차 방진의 예로서 보조방진 확장이 이해되었을 것이라 생각한다.

그럼 확장된 방진을 토대로 작성해 보도록 하자.

작성 방법은 상하좌우 끝단의 어딘가 에서 시작하여 인접한 빈칸이 있는 대각선으로 이동하는데, 이동중 더이상 빈칸이 없을 경우 현재 대각선의 시작점의 인접한 다른 대각선으로 이동하여 새로운 시작을 한다.

이때 주의 할 점은 각 대각선이 시작하여 진행할때 이동되는 대각선의 방향이 모두 일치해야 한다는 것이다.

위의 조건이 더이상 적용되지 않을 때가 보조방진 작성의 완성이다.

다음은 3차보조방진과 5차보조방진의 왼쪽 끝단에서 오른쪽위로 진행하는 방식으로 작성된 예이다.

 

 

 

3

 

 

 

2

 

6

 

1

 

5

 

9

 

4

 

8

 

 

 

7

 

 

 

 

 

 

5

 

 

 

 

 

 

 

4

 

10

 

 

 

 

 

3

 

9

 

15

 

 

 

2

 

8

 

14

 

20

 

1

 

7

 

13

 

19

 

25

 

6

 

12

 

18

 

24

 

 

 

11

 

17

 

23

 

 

 

 

 

16

 

22

 

 

 

 

 

 

 

21

 

 

 

 

 

보조방진이 완성된 이후에는 방진의 정중앙을 기준으로 하여 기준의 반대방향으로 방진의 빨간선 외부의 칸을 내부의 칸으로 위치 이동시킨다.

다음 표에서 처럼 순차적으로 파란영역을 노란 영역으로 이동한다.

 

 

 

 

3

 

 

 

2

 

6

 

1

 

5

 

9

 

4

 

8

 

 

 

7

 

 

 

 

 

 

 

 

 

2

 

6

 

1

 

5

 

9

 

4

3

8

 

 

 

7

 

 

 

 

 

 

 

 

 

2

 

6

 

 

 

5

1

9

 

4

3

8

 

 

 

7

 

 

 

 

 

 

 

 

 

2

 

6

 

 

9

5

1

 

 

4

3

8

 

 

 

7

 

 

 

 

 

 

 

 

 

2

7

6

 

 

9

5

1

 

 

4

3

8

 

 

 

 

 

 

 

 

 

 

 

5

 

 

 

 

 

 

 

4

 

10

 

 

 

 

 

3

 

9

 

15

 

 

 

2

 

8

 

14

 

20

 

1

 

7

 

13

 

19

 

25

 

6

 

12

 

18

 

24

 

 

 

11

 

17

 

23

 

 

 

 

 

16

 

22

 

 

 

 

 

 

 

21

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3

 

9

 

15

 

 

 

2

 

8

 

14

 

20

 

1

 

7

 

13

 

19

 

25

 

6

 

12

5

18

 

24

 

 

 

11

4

17

10

23

 

 

 

 

 

16

 

22

 

 

 

 

 

 

 

21

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3

 

9

 

15

 

 

 

 

 

8

 

14

2

20

 

 

 

7

 

13

1

19

 

25

 

 

 

12

5

18

6

24

 

 

 

11

4

17

10

23

 

 

 

 

 

16

 

22

 

 

 

 

 

 

 

21

 

 

 

 

 

 

 

 

     

 

 

 

 

 

 

     

 

 

 

 

 

3

 

9

 

15

 

 

   

20

8

 

14

2

20

 

   

7

25

13

1

19

 

25

   

24

12

5

18

6

24

 

 

 

11

4

17

10

23

 

 

 

 

 

16

 

22

 

 

 

 

 

 

 

21

 

 

 

 

 

 

 

 

     

 

 

 

 

 

 

     

 

 

 

 

 

3

16

9

22

15

 

 

   

20

8

21

14

2

   
   

7

25

13

1

19

   
   

24

12

5

18

6

   

 

 

11

4

17

10

23

 

 

 

 

 

     

 

 

 

 

 

 

     

 

 

 

위의 예시와 같이 모두 이동하여 빨간 원래의 마방진 안에 모든 숫자의 배치가 끝났다면 다음과 같이 보조방진만 지우면 마방진이 완성된다.

 

2

7

6

9

5

1

4

3

8

3

16

9

22

15

20

8

21

14

2

7

25

13

1

19

24

12

5

18

6

11

4

17

10

23

 

2. 규칙적 순차 배치

이름정하는게 쉽지가 않다.

본인 나름대로 그냥 규칙적 순차 배치라 부르기로 했다.

이번에 소개할 두번째 방식은 보조방진을 만들지 않는다.

마방진의 정중앙의 칸을 기준으로 상하좌우 가장자리의 4칸중 하나를 선택하여 1부터 시작한다.

다음으로 중앙에서 멀어지는 쪽의 대각선으로 방향을 정하여 순차적으로 기록하는데, 대각선 이동중 방진을 벋어났다면 방진의 같은열 또는 같은행의 반대쪽 끝으로 이동한다.

또한 위의 규칙대로 이동이 불가능한 경우(다음칸에 이미 값이 있다거나, 대각선 끝에서 방진을 벋어나 같은 해이나 열이 방진내에 존재하지 않을 경우)에는 대각선으로 이동하지 않고 상하좌우 4칸중 진행방향과는 멀고 중앙과는 가까운 쪽으로 한칸이동한후 다시 대각선으로 이동한다.

쓰고보니 말이 어렵다.

실재 예를 보도록 하자.

3차마방진의 형성과정이며 시작지점은 상단, 진행방향은 오른쪽위로 정하고 기록하도록 하겠다.

① 시작지점 기록

 

 1

 

 

 

 

 

 

 

② 대각선 이동

 

 

 

2

 

 

 

1

 

 

 

 

 

 

 

 

 

 

2

 

 

 

 

 

 

1에서 2 파란색 칸으로 대각선 이동하였으나 마방진의 범위를 벋어남으로 마주보는 마방진내의 반대쪽 끝인 노란색칸으로 이동하였다.

다음 표에서도 깉은 방식으로 3파란색칸으로 이동하였으나 역시 마방진의 범위를 벋어남으로 마주보는 마방진내의 반대쪽 끝인 노란색칸으로 이동하였다.

 

 

 

 

 

 

 

1

 

 

 

3

 

 

3

 

 

 

2

 

 

 

 

 

 

③ 대각선 이동이 불가능한 경우

 

 

 

 

 

 

 

1

 

 

 

3

 

 

 

 

4

 

2

 

 

 

 

 

 

3에서 대각선으로 빨간색칸에 이동하려 하니 이미 1의 값이 기록되어있어 대각선으로 이동하지 못하며, 방진을 벋어나지도 않는다.

그러므로 이동할수 있는 상하좌우 4칸중 한곳으로 이동해야 하는데, 좌는 방진을 벋어나고 우는 중앙 기준점이라 이동이 불가하다 이동할수 있는 상하의 두칸중에 대각선 진행방향과 더 멀어지는 겨우는 아래임으로 밑으로 한칸 이동한다.

 

이후 정해진 규칙대로 대각선으로 진행하여 보니 다음과 같이 진행된다.

 

 

 

 

 

 

 

1

6

 

 

3

5

7

 

 

4

 

2

 

 

 

 

 

 

노란색 칸의 5와 6을 기록한 후 빨간색칸으로 대각선이동을 하면 방진을 벋어나기는 하나 평행이동이 불가능함으로 ③과 같이 아래로 한칸이동하였다.

 

 

 

 

 

 

 

8

1

6

8

 

3

5

7

 

 

4

 

2

 

 

 

 

 

 

 

 

9

 

 

 

8

1

6

 

 

3

5

7

 

 

4

9

2

 

 

 

 

 

 

 

 

다음 같은 규칙으로 8을 기록하였고 마지막으로 9를 기록함으로 마방진을 완성하였다.

8

1

6

3

5

7

4

9

2

다음은 같은 방식으로 5차마방진을 완성한 모습이다.

17↗

24↗

1↗

8↗

15↓

23↗

5↓

7↗

14↗

16↗

4↗

6↗

13↗

20↓

22↗

10↓

12↗

19↗

21↗

3↗

11↗

18↗

25

2↗

9↗

위의 완성표에서 화살표는 진행 방향이다.

 

홀수 마방진의 풀이과정을 두가지로 나누어서 생각해 보았는데 자세히 들여다 보면 결국은 두방식다 똑같다는 것을 알 수 있다.

규칙을 조금 정리해 보자면 중앙기준을 중심으로 기준을 재외한 십자영역에 해당하는 칸 어디서는 시작을 하면 되고 어디에서 시작하냐에 따라 어떤 대각선 방향으로 진행할지 결정하고 진행중 차수의 배수에 해당하는 수에서 다음수로의 진행은 십자방향중 한방향을 잡아 일정칸만큼 이동한다고 정리 할 수 있겠다.

다음은 중앙기준 1칸 아래에서 시작하여 오른쪽 아래로 진행하며 차수의 배수에서 다음수로 아래로 2칸 이동하는 규칙으로 완성한 7차 마방진의 완성모습이다.

 

22

47

16

41

10

35

4

5

23

48

17

42

11

29

30

6

24

49

18

36

12

13

31

7

25

43

19

37

38

14

32

1

26

44

20

21

39

8

33

2

27

45

46

15

49

9

34

3

28

 

 

최종적으로 마지막에 했던 방식대로 php를 이용하여 구현해본 코드는 다음과 같다.

 

if ( $square%2 == 1 )
{
 $i = ($square-1)/2 + 1 ;
 $j = ($square-1)/2 ;
 for( ($k = 1) ; ($k <= ($square*$square)) ; $k++ )
 {
  $sq[$i][$j] = $k ;
  if ( $k % $square == 0 )
  {
   $i = $i + 2 ;
  }
  else
  {
   $i++ ;
   $j++ ;
  }
  if ( $i >= $square )
  {
   $i = $i - $square ;
  }
  elseif ( $j >= $square )
  {
   $j = $j - $square ;
  }
 }
}

 

여기서 $square는 차수를 의미하며, $i와 $j는 행열을 의미한다.

List of Articles
번호 제목 글쓴이 날짜 조회 수
309 Xpress Engine xe 포인트 레벨과 등급 동기화 에드온 2.0 file LynX 2016-09-21 51
308 Xpress Engine xe 현재접속과 로그인 수 표시 addon 수정본 file [1] LynX 2016-09-20 572
307 Linux DDOS 방어 LynX 2016-09-19 287
306 Xpress Engine 현재접속과 로그인 수 표시 addon file LynX 2016-09-10 51
305 Server 웹 동접자 수 확인 코드 LynX 2016-09-08 191
304 Linux 하위 디렉토리 문자열 일괄검색,치환 LynX 2016-08-24 92
303 Linux Apache httpd mod_evasive compile LynX 2016-08-22 95
302 Linux firewalld DDOS 차단 LynX 2016-08-22 401
301 Programing Magic Square (마방진) - 마방진코드와 나의 생각 03 LynX 2016-08-09 81
300 Programing Magic Square (마방진) - 마방진코드와 나의 생각 02 LynX 2016-08-09 86
299 Programing 베너관리 코드 LynX 2016-08-04 61
298 Programing Magic Square (마방진) - 마방진코드와 나의 생각 01 LynX 2016-07-27 179
297 Linux iconv 이용 문자셋 일괄 변경 LynX 2016-07-21 80
296 Programing Magic Square (마방진) - php source code LynX 2016-07-21 167
295 Programing Magic Square (마방진) - java script source LynX 2016-07-18 517
294 Programing Magic Square (마방진) - 4배수가 아닌 짝수 LynX 2016-07-15 210
» Programing Magic Square (마방진) - 홀수 LynX 2016-07-15 174
292 Programing Magic Square (마방진) - 4의 배수 LynX 2016-07-15 253
291 Linux OpenBSD APM Source Compile [2] LynX 2016-07-04 516
290 Network vpn LynX 2016-06-29 116

XE Login