You cannot see this page without javascript.

Magic Square (마방진) - 4배수가 아닌 짝수

Programing 조회 수 2453 추천 수 0 2016.07.15 09:12:45

아마도 이번 포스팅이 끝나면 모든 차수의 마방진 풀이법이 완료될 것이다.

바로 시작해 보도록 하자.

다음은 6차 마방진의 진행과정이다.

다음의 표와 같이 방진의 대각선을 구분짓자.

           
           
           
           
           
           

 

여기서 다음표와 같이 색칠되어진 대각선에 포함되는 칸은 순차적으로 기록을 하고 색칠되지 않은 칸은 역으로 숫자를 기록하자.

1

35 34 33 32

6

30

8

28 27

11

25
24 23

15

16

20 19
18 17

21

22

14 13
12

26

10 9

29

7

31

5

4 3 2

36

 

그리고 방진의 가로에서 시작점으로부터 3번째칸과 4번째칸의 경계를 기준으로 좌우로 경계선을 나누는데, 여기서 주의할 점은 경계선이 좌상-우하 대각선을 지나는 시점에서 좌측으로 1칸 이동하고 우상-좌하 대각선을 지나는 시점에서는 다시 우측으로 한칸이동된다는 점이다.

세로도 역시 시작점으로부터 3번째칸과 4번째칸의 경계를 기준으로 상하로 경계선을 나누는데, 여기서도 마찬가지로 경계선이 좌상-우하 대각선을 지나는 시점에서 위로 1칸 이동하고 우상-좌하 대각선을 지나는 시점에서는 다시 아래로 한칸이동된다는 점이다.

글로 설명을 이해하기에 많이 힘이들기 때문에 다음 그림을 참고하자.

1

35 34 33 32

6

30

8

28 27

11

25
24 23

15

16

20 19
18 17

21

22

14 13
12

26

10 9

29

7

31

5

4 3 2

36

 

파란색 경계선의 오른쪽에서 아래 그림의 파란색과 같은 패턴에 해당하는 칸을 하나의 구역으로 나누고,

녹색 경계선의 아래쪽에서는 녹색과 같은 패턴에 해당하는 칸을 하나의 구역으로 나눈다.

1

35 34 33 32

6

30

8

28 27

11

25
24 23

15

16

20 19
18 17

21

22

14 13
12

26

10 9

29

7

31

5

4 3 2

36

 

나누어진 구역중 파란색 구역은 상하중앙을 기준으로 위치교환을 하고,

녹색구역은 좌우중앙을 기준으로 위치교환을 한다.

1

35 34 3 32

6

30

8

28 27

11

7
24 23

15

16

14 19

13

17

21

22

20 18
12

26

9 10

29

25

31

2

4 33 5

36

 

형성된 마방진의 구역나눔표시와 경계선들을 지우면 다음과 같이 마방진이 완성된다.

1

35 34 3 32

6

30

8

28 27

11

7
24 23

15

16

14 19
13 17

21

22

20 18
12

26

9 10

29

25

31

2

4 33 5

36

 

4의 베수가 아닌 마방진중 6차마방진이 가장 작은 것이라 상단에서 제시한 위치교환 패턴이 눈에 잘 들어오지 않을수도 있고 패턴을 작성하는 경계선의 정확한 구분점도 잘 눈에 들어오지 않는다.

그리고 6차마방진의 경우 3번째와 4번째의 경계가 정확히 절반으로 형성되기 때문에 경계선 작성시의 특이점들이 보이지가 않는다.

그래서 10차와 14차 마방지의 변환과정을 한번 더 보도록 하자.

① 방진 기초 배열 기록 과 경계선 작성

1 99 98 97 96 95 94 93 92 10
90 12 88 87 86 85 84 83 19 81
80 79 23 77 76 75 74 28 72 71
70 69 68 34 66 65 37 63

62

61
60 59 58 57 45 46 54 53 52 51
50 49 48 47 55 56 44 43 42 41
40 39 38 64 36 35 67 33 32 31
30 29 73 27 26 25 24 78 22 21
20 82 18 17 16 15 14 13 89 11
91 9 8 7 6 5 4 3 2 100

 

1 195 194 193 192 191 190 189 188 187 186 185 184 14
182 16 180 179 178 177 176 175 174 173 172 171 27 169
168 167 31 165 164 163 162 161 160 159 158 40 156 155
154 153 152 46 150 149 148 147 146 145 53 143 142 141
140 139 138 137 61 135 134 133 132 66 130 129 128 127
126 125 124 123 122 76 120 119 79 117 116 115 114 113
112 111 110 109 108 107 91 92 104 103 102 101 100 99
98 97 96 95 94 93 105 106 90 89 88 87 86 85
84 83 82 81 80 118 78 77 121 75 74 73 72 71
70 69 68 67 131 65 64 63 62 136 60 59 58 57
56 55 54 144 52 51 50 49 48 47 151 45 44 43
42 41 157 39 38 37 36 35 34 33 32 166 30 29
28 170 26 25 24 23 22 21 20 19 18 17 181 15
183 13 12 11 10 9 8 7 6 5 4 3 2 196

 

② 특정패턴구역 위치교환

1 99 98 97 6 5 94 3 92 10
90 12 88 17 86 85 14 83 19 11
80 79 23 74 26 25 77 28 22 71
70 62 38 34 65 66 37 33 69 31
51 59 53 47 45 46 44 58 42 60
41 49 43 57 55 56 54 48 52 50
40 32 68 64 35 36 67 63 39 61
21 29 73 24 76 75 27 78 72 30
20 82 13 87 15 16 84 18 89 81
91 2 8 4 96 95 7 93 9 100

 

1 195 194 193 10 191 8 7 188 5 186 3 184 14
182 16 180 25 178 23 176 175 20 173 18 171 27 15
168 167 31 158 38 160 36 35 163 33 165 40 30 155
154 142 54 46 145 51 147 148 48 150 53 45 153 43
127 139 129 67 61 132 64 63 135 66 60 138 58 140
126 114 82 116 80 76 119 120 79 75 123 73 125 71
99 111 101 95 103 93 91 92 90 108 88 110 86 112
85 97 87 109 89 107 105 106 104 94 102 96 100 98
84 72 124 74 122 118 77 78 121 117 81 115 83 113
57 69 59 137 131 62 134 133 65 136 130 68 128 70
56 44 152 144 47 149 49 50 146 52 151 143 55 141
29 41 157 32 164 34 162 161 37 159 39 166 156 42
28 170 17 179 19 177 21 22 174 24 172 26 181 169
183 2 12 4 192 6 190 189 9 187 11 185 13 196

 

위의 10차와 14차를 통하여 해법이 이해되었으리라 생각된다.

더 이상의 예를 보여줄 필요는 없다 생각 되기에 마지막으로 php코드를 보도록 하자.

이 코드는 우측상단에서 시작하여 좌측 하단으로 끝나는 4배수가 아닌 짝수 마방진의 풀이법을 구현해본 코드는 다음과 같다.

 

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

 

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

 

 

 

태그
엮인글 :
List of Articles
번호 제목 글쓴이 날짜 조회 수

XE Login