|
数字の並び位置を、
① ④
/\ /\
②─③─⑤─⑥
\/
⑦
/\
⑧─⑨
とする。
3x3魔方陣のように、
①②③
④⑤⑥
⑦⑧⑨
と並べると、
題意は、
3つの行と3つの列と右斜め(すなわち、左斜めを除いた7箇所)の和が一致するもの
と解釈できる。
3x3魔方陣の1つは、
2 7 6
9 5 1
4 3 8
なので、
3 8 4
2 7 6 2
1 9 5 1 9
8 4 3 8
6 2 7
とスライドさせた3パターンの配置は題意を満たす。
3x3魔方陣は対称性(回転と鏡面)を考えると8通りあるから、3*8=24通り。
No.20の並びは、きれいだ!?
!アインシュタインの問題
PUBLIC NUMERIC C !解の個数
LET C=0
DIM F(9) !数字
MAT F=ZER
DIM A(9) !並び
CALL try(1,F,0, A)
END
EXTERNAL SUB try(P,F(),S, A()) !バックトラック法で検索する
FOR i=1 TO 9 !未使用な数字が候補である
IF F(i)=0 THEN
LET F(i)=1 !使用中
LET A(P)=i !仮にこの数字とする
LET OK=1
SELECT CASE P
CASE 3
LET S=A(1)+A(2)+A(3) !1つ目の三角形の和
CASE 6
IF A(4)+A(5)+A(6)<>S THEN LET OK=0 !NGとする
CASE 7
IF A(1)+A(4)+A(7)<>S THEN LET OK=0
IF A(3)+A(5)+A(7)<>S THEN LET OK=0
CASE 8
IF A(2)+A(5)+A(8)<>S THEN LET OK=0
CASE 9
IF A(7)+A(8)+A(9)<>S THEN LET OK=0
IF A(3)+A(6)+A(9)<>S THEN LET OK=0
!!IF A(1)+A(5)+A(9)<>S THEN LET OK=0 !3x3の魔方陣
CASE ELSE
END SELECT
IF OK=1 THEN !条件を満たすなら
IF P=9 THEN !すべて並んだなら
LET C=C+1
PRINT "No.";C
MAT PRINT A;
ELSE
CALL try(P+1,F,S, A) !次へ
END IF
END IF
LET F(i)=0 !元に戻す
END IF
NEXT i
END SUB
実行結果
No. 1
1 6 8 9 2 4 5 7 3
No. 2
1 8 6 9 4 2 5 3 7
No. 3
1 9 5 6 2 7 8 4 3
No. 4
1 9 5 8 4 3 6 2 7
No. 5
2 7 6 9 5 1 4 3 8
No. 6
2 9 4 7 5 3 6 1 8
No. 7
3 4 8 7 2 6 5 9 1
No. 8
3 7 5 4 2 9 8 6 1
No. 9
3 7 5 8 6 1 4 2 9
No. 10
3 8 4 7 6 2 5 1 9
No. 11
4 3 8 9 5 1 2 7 6
No. 12
4 9 2 3 5 7 8 1 6
No. 13
6 1 8 7 5 3 2 9 4
No. 14
6 7 2 1 5 9 8 3 4
No. 15
7 2 6 3 4 8 5 9 1
No. 16
7 3 5 2 4 9 6 8 1
No. 17
7 3 5 6 8 1 2 4 9
No. 18
7 6 2 3 8 4 5 1 9
No. 19
8 1 6 3 5 7 4 9 2
No. 20
8 3 4 1 5 9 6 7 2
No. 21
9 1 5 2 6 7 4 8 3
No. 22
9 1 5 4 8 3 2 6 7
No. 23
9 2 4 1 6 8 5 7 3
No. 24
9 4 2 1 8 6 5 3 7
|
|