You cannot see this page without javascript.

Magic Square (마방진) - 4의 배수

Programing 조회 수 2450 추천 수 0 2016.07.15 09:11:21

마방진이라는 것에 대하여 적어볼려고 한다.

마방진의 역사, 발생원인 등등 뭔가 대단한 것들이 검색하니까 쏟아져 나오던데,

그런 것들에 대하여 뭔가 사고해보고 싶은것은 아니다.

다만 퍼즐 같은 느낌의 마방진을 항상 풀 수 있는 어떤 해법은 없을까 생각해보고 싶었다.

약간의 시간을 두고 생각해보니 답은 있었고 답까지 진행했던 나의 생각들을 정리하고 싶어서 여기에 끄적여 본다.

검색을 통하여 엄청나게 많은 해법들을 볼수 있다.

내가 제시하는 방법도 그중에 한가지일 뿐이라 생각한다.

자료들을 보니 다들 홀수와 짝수로 나누어 해법을 하고 있고,

또한 그중 짝수를 4의 배수와 그외의 것으로 나누어 해법을 하고 있었다.

나또한 해법 그룹을 그렇게 나누어 생각하였고 오늘은 그중 4배수에 대한 해법을 알아보려 한다.

또한 이 방법을 php로 표현하여 웹상에서 마방진이 자동 생성되도록 프로그래밍도 해보았는데 뒤에 소스도 공개하도록 할 예정이다.

 

4배수 풀이방법

1. 전채를 비율로 패턴분할하여 계산하는 방법

아래 표는 4차 마방진의 완성모습이다.

1

15

14

4

12

6

7

9

8

10

11

5

13

3

2

16

완성모습으로 변화하는 과정을 보자.

다음 표를 보면 색갈을 통하여 두구역으로 나누어 놨다.

1

15

14

4

12

6

7

9

8

10

11

5

13

3

2

16

노란색칸에는 숫자가 순서대로 진행이 되고, 흰색칸에는 숫자가 거꾸로 진행됨을 알수 있다.

놀랍게도 이렇게 순서만 바꾸었을 뿐인데 가로,세로,대각선의 합이 일치한다.

첫번째 방법은 이런패턴으로 모든 4배수 마방진을 완성하는 것이다.

확인을 위하여 다음으로 8차 마방진을 보자.

<

1 2 62 61 60 59 7 8
9 10 54 53 52 51 15 16
48 47 19 20 21 22 42 41
40 39 27 28 29 30 34 33
32 31 35 36 37 38 26 25
24 23 43 44 45 46 18 17
49 50 14 13 12 11 55 56
57 58 6 5 4 3 63 64

표에서 보는것과 같이 같은 패턴으로 크기만 확장된 모습이다.

이정도 참조하면 12차나 16차도 어떤모습인지 예측이 될거라 생각한다.

 

2. 단위패턴으로 증가하여 계산하는 방법

4차 마방진은 위에서 알아보았던 방법과 동일하다.

다만 8차나 16차로 올라감에 따라 패턴의 크기가 증가하는 것이 아니라 기본패턴 자체가 증가되는 방식이다.

말로는 설명이 어려우니 바로 8차 마방진의 패턴을 보도록하자.

1 63 62 4 5 59 58 8
56 10 11 53 52 14 15 49
48 18 19 45

44

22 23 41
25 39 38 28 29 35 34 32
33 31 30 36 37 27 26 40
24 42 43 21 20 46 47 17
16 50 51 13 12 54 55 9
57 7 6 60 61 3 2 64

위 표와 같이 기본 4x4 패턴이 증가하여 전채로 형성된다.

정리해 보자면 두방법 모두 어떤 시작지점에서 진행함에 있어 패턴확장이든 패턴증가든 한패턴에서 진행함에 있어 다른패턴은 반대로 진행하면 된다.

다시 말해서 시작을 왼쪽위에서 하든, 왼쪽 밑에서 하든, 가로로 하든, 새로로 하든 패펀분리만 시킨후 다른패턴을 역으로 기록한다.

다음은 오른쪽위에서 가로로 진행하며 기본패턴증가방식으로 형성한 12차 마방진의 완성모습이다.

12

134

135

9

8

138

139

5

4

142

143

1

121

23

22

124

125

19

18

128

129

15

14

132

109

35

34

112

113

31

30

116

117

27

26

120

48

98

99

45

44

102

103

41

40

106

107

37

60

86

87

57

56

90

91

53

52

94

95

49

73

71

70

76

77

67

66

80

81

63

62

84

61

83

82

64

65

79

78

68

69

75

74

72

96

50

51

93

92

54

55

89

88

58

59

85

108

38

39

105

104

42

43

101

100

46

47

97

25

119

118

28

29

115

114

32

33

111

110

36

13

131

130

16

17

127

126

20

21

123

122

24

144

2

3

141

140

6

7

137

136

10

11

133

 

 

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

 

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

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

 

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

XE Login