『魔法陣』完全魔方陣をPythonで解く

目次

完全魔法陣とは

例えば、4次魔方陣であれば、縦、横、斜めの4つ数字が循環するように、合計がすべて34になるものがあります。

縦は、

1+15+6+12 = 34

14+4+9+7 = 34

11+5+16+2 = 34

8+10+3+13 = 34

横は、

1+14+11+8 = 34

15+4+5+1 = 34

6+9+16+3 = 34

12+7+2+13 = 34

斜め(右下がり)は、

1+4+16+13 = 34

14+5+3+12 = 34

11+10+6+7 = 34

8+15+9+2 = 34

斜め(左下がり)は、

1+10+16+7 = 34

14+15+3+2 = 34

11+4+6+13 = 34

8+5+9+12 = 34

ちょうど円筒に巻きつけた無限に続く魔方陣、というイメージになります。

完全魔法陣のイメージ図

完全魔方陣(4次)の全解答48通りを算出するプログラム(Pythonコード)

以下が、4次の完全魔方陣の全解答48通りを算出するプログラム(Pythonコード)になります。

a=0;b=0;c=0;d=0;e=0;f=0;g=0;h=0;i=0;j=0;k=0;l=0;m=0;n=0;o=0;p=0#要素の初期化
cnt=0#カウンタの初期化

for ai in range(16):#ループ1
	a=ai+1#aの確定(0,0)
	
	for di in range(16):#ループ2
		d=di+1#dの確定(3,0)
		if(d>a):
		
			for mi in range(16):#ループ3
				m=mi+1#mの確定(0,3)
				if (m>d):
					p=34-(a+d+m)#pの確定(3,3)
					if (p<17) and (p>0) and (p>a) and (p!=d) and (p!=m) :
					
						for fi in range(16):#ループ4
							f=fi+1#fの確定(1,1)
							if (f!=a) and (f!=d) and (f!=m) and (f!=p):	
								k=34-(a+f+p)#kの確定(2,2)
								if (k<17) and (k>0) and (k!=a) and (k!=d) and (k!=m) and (k!=p) and (k!=f):
								
									for gi in range(16):#ループ5
										g=gi+1#gの確定(2,1)
										if (g!=a) and (g!=d) and (g!=m) and (g!=p) and (g!=f) and (g!=k):
											j=34-(f+g+k)#jの確定(2,2)
											if (j<17) and (j>0) and (j!=a) and (j!=d) and (j!=m) and (j!=p) and (j!=f) and (j!=k) and (j!=g):
											
												for bi in range(16):#ループ6
													b=bi+1#bの確定(1,0)
													if (b!=a) and (b!=d) and (b!=m) and (b!=p) and (b!=f) and (b!=k) and (b!=g) and (b!=j):	
														c=34-(a+b+d)#cの確定(2,0)
														n=34-(b+f+j)#nの確定(1,3)
														o=34-(c+g+k)#oの確定(2,3)
														if (c<17) and (c>0) and (c!=a) and (c!=d) and (c!=m) and (c!=p) and (c!=f) and (c!=k) and (c!=g) and (c!=j) and (c!=b):
															if (n<17) and (n>0) and (n!=a) and (n!=d) and (n!=m) and (n!=p) and (n!=f) and (n!=k) and (n!=g) and (n!=j) and (n!=b) and (n!=c):
																if (o<17) and (o>0) and (o!=a) and (o!=d) and (o!=m) and (o!=p) and (o!=f) and (o!=k) and (o!=g) and (o!=j) and (o!=b) and (o!=c) and (o!=n):
																
																	for ei in range(16):#ループ7
																		e = ei+1#eの確定(1,0)
																		if (e!=a) and (e!=d) and (e!=m) and(e!=p) and(e!=f) and (e!=k) and (e!=g) and (e!=j) and (e!=b) and (e!=c) and (e!=n) and (e!=o):
																			h=34-(e+f+g)#hの確定(3,1)
																			i=34-(a+e+m)#iの確定(0,2)
																			l=34-(d+h+p)#lの確定(3,2)
																			if (h<17) and (h>0) and (h!=a) and (h!=d) and (h!=m) and (h!=p) and(h!=f) and (h!=k) and (h!=g) and(h!=j) and(h!=b) and (h!=c) and (h!=n) and (h!=o) and (h!=e):
																				if (i<17) and (i>0) and (i!=a) and (i!=d) and (i!=m) and (i!=p) and (i!=f) and (i!=k) and (i!=g) and (i!=j) and (i!=b) and (i!=c) and (i!=n) and (i!=o) and (i!=e) and (i!=h):
																					if (l<17) and (l>0) and (l!=a) and (l!=d) and (l!=m) and (l!=p) and (l!=f) and (l!=k) and (l!=g) and (l!=j) and (l!=b) and (l!=c) and (l!=n) and (l!=o) and (l!=e) and (l!=h) and (l!=i):
																						if(b+e+l+o==34) and (c+h+i+n==34) and (d+e+j+o==34) and (b+g+l+m==34) and (a+h+k+n==34) and (c+f+i+p==34):
																							cnt+=1
																							print(cnt,"a=",a,": b=",b,": c=",c,": d=",d,": e=",e,": f=",f,": g=",g,": h=",h,": i=",i,": j=",j,": k=",k,": l=",l,": m=",m,": n=",n,": o=",o,": p=",p)

出力は以下のようになります。(全部で48個なので、全部掲載します。)

1 a= 1 : b= 14 : c= 11 : d= 8 : e= 15 : f= 4 : g= 5 : h= 10
: i= 6 : j= 9 : k= 16 : l= 3 : m= 12 : n= 7 : o= 2 : p= 13
2 a= 1 : b= 15 : c= 10 : d= 8 : e= 14 : f= 4 : g= 5 : h= 11
: i= 7 : j= 9 : k= 16 : l= 2 : m= 12 : n= 6 : o= 3 : p= 13
3 a= 1 : b= 12 : c= 13 : d= 8 : e= 15 : f= 6 : g= 3 : h= 10
: i= 4 : j= 9 : k= 16 : l= 5 : m= 14 : n= 7 : o= 2 : p= 11
4 a= 1 : b= 15 : c= 10 : d= 8 : e= 12 : f= 6 : g= 3 : h= 13
: i= 7 : j= 9 : k= 16 : l= 2 : m= 14 : n= 4 : o= 5 : p= 11
5 a= 1 : b= 12 : c= 13 : d= 8 : e= 14 : f= 7 : g= 2 : h= 11
: i= 4 : j= 9 : k= 16 : l= 5 : m= 15 : n= 6 : o= 3 : p= 10
6 a= 1 : b= 14 : c= 11 : d= 8 : e= 12 : f= 7 : g= 2 : h= 13
: i= 6 : j= 9 : k= 16 : l= 3 : m= 15 : n= 4 : o= 5 : p= 10
7 a= 1 : b= 8 : c= 13 : d= 12 : e= 15 : f= 10 : g= 3 : h= 6
: i= 4 : j= 5 : k= 16 : l= 9 : m= 14 : n= 11 : o= 2 : p= 7
8 a= 1 : b= 15 : c= 6 : d= 12 : e= 8 : f= 10 : g= 3 : h= 13
: i= 11 : j= 5 : k= 16 : l= 2 : m= 14 : n= 4 : o= 9 : p= 7
9 a= 1 : b= 8 : c= 13 : d= 12 : e= 14 : f= 11 : g= 2 : h= 7
: i= 4 : j= 5 : k= 16 : l= 9 : m= 15 : n= 10 : o= 3 : p= 6
10 a= 1 : b= 14 : c= 7 : d= 12 : e= 8 : f= 11 : g= 2 : h= 13
: i= 10 : j= 5 : k= 16 : l= 3 : m= 15 : n= 4 : o= 9 : p= 6
11 a= 1 : b= 8 : c= 11 : d= 14 : e= 12 : f= 13 : g= 2 : h= 7
: i= 6 : j= 3 : k= 16 : l= 9 : m= 15 : n= 10 : o= 5 : p= 4
12 a= 1 : b= 12 : c= 7 : d= 14 : e= 8 : f= 13 : g= 2 : h= 11
: i= 10 : j= 3 : k= 16 : l= 5 : m= 15 : n= 6 : o= 9 : p= 4
13 a= 2 : b= 13 : c= 12 : d= 7 : e= 16 : f= 3 : g= 6 : h= 9
: i= 5 : j= 10 : k= 15 : l= 4 : m= 11 : n= 8 : o= 1 : p= 14
14 a= 2 : b= 16 : c= 9 : d= 7 : e= 13 : f= 3 : g= 6 : h= 12
: i= 8 : j= 10 : k= 15 : l= 1 : m= 11 : n= 5 : o= 4 : p= 14
15 a= 2 : b= 11 : c= 14 : d= 7 : e= 16 : f= 5 : g= 4 : h= 9
: i= 3 : j= 10 : k= 15 : l= 6 : m= 13 : n= 8 : o= 1 : p= 12
16 a= 2 : b= 16 : c= 9 : d= 7 : e= 11 : f= 5 : g= 4 : h= 14
: i= 8 : j= 10 : k= 15 : l= 1 : m= 13 : n= 3 : o= 6 : p= 12
17 a= 2 : b= 11 : c= 14 : d= 7 : e= 13 : f= 8 : g= 1 : h= 12
: i= 3 : j= 10 : k= 15 : l= 6 : m= 16 : n= 5 : o= 4 : p= 9
18 a= 2 : b= 13 : c= 12 : d= 7 : e= 11 : f= 8 : g= 1 : h= 14
: i= 5 : j= 10 : k= 15 : l= 4 : m= 16 : n= 3 : o= 6 : p= 9
19 a= 2 : b= 7 : c= 14 : d= 11 : e= 16 : f= 9 : g= 4 : h= 5
: i= 3 : j= 6 : k= 15 : l= 10 : m= 13 : n= 12 : o= 1 : p= 8
20 a= 2 : b= 16 : c= 5 : d= 11 : e= 7 : f= 9 : g= 4 : h= 14
: i= 12 : j= 6 : k= 15 : l= 1 : m= 13 : n= 3 : o= 10 : p= 8
21 a= 2 : b= 7 : c= 14 : d= 11 : e= 13 : f= 12 : g= 1 : h= 8
: i= 3 : j= 6 : k= 15 : l= 10 : m= 16 : n= 9 : o= 4 : p= 5
22 a= 2 : b= 13 : c= 8 : d= 11 : e= 7 : f= 12 : g= 1 : h= 14
: i= 9 : j= 6 : k= 15 : l= 4 : m= 16 : n= 3 : o= 10 : p= 5
23 a= 2 : b= 7 : c= 12 : d= 13 : e= 11 : f= 14 : g= 1 : h= 8
: i= 5 : j= 4 : k= 15 : l= 10 : m= 16 : n= 9 : o= 6 : p= 3
24 a= 2 : b= 11 : c= 8 : d= 13 : e= 7 : f= 14 : g= 1 : h= 12
: i= 9 : j= 4 : k= 15 : l= 6 : m= 16 : n= 5 : o= 10 : p= 3
25 a= 3 : b= 13 : c= 12 : d= 6 : e= 16 : f= 2 : g= 7 : h= 9
: i= 5 : j= 11 : k= 14 : l= 4 : m= 10 : n= 8 : o= 1 : p= 15
26 a= 3 : b= 16 : c= 9 : d= 6 : e= 13 : f= 2 : g= 7 : h= 12
: i= 8 : j= 11 : k= 14 : l= 1 : m= 10 : n= 5 : o= 4 : p= 15
27 a= 3 : b= 10 : c= 15 : d= 6 : e= 16 : f= 5 : g= 4 : h= 9
: i= 2 : j= 11 : k= 14 : l= 7 : m= 13 : n= 8 : o= 1 : p= 12
28 a= 3 : b= 16 : c= 9 : d= 6 : e= 10 : f= 5 : g= 4 : h= 15
: i= 8 : j= 11 : k= 14 : l= 1 : m= 13 : n= 2 : o= 7 : p= 12
29 a= 3 : b= 10 : c= 15 : d= 6 : e= 13 : f= 8 : g= 1 : h= 12
: i= 2 : j= 11 : k= 14 : l= 7 : m= 16 : n= 5 : o= 4 : p= 9
30 a= 3 : b= 13 : c= 12 : d= 6 : e= 10 : f= 8 : g= 1 : h= 15
: i= 5 : j= 11 : k= 14 : l= 4 : m= 16 : n= 2 : o= 7 : p= 9
31 a= 3 : b= 6 : c= 15 : d= 10 : e= 16 : f= 9 : g= 4 : h= 5
: i= 2 : j= 7 : k= 14 : l= 11 : m= 13 : n= 12 : o= 1 : p= 8
32 a= 3 : b= 16 : c= 5 : d= 10 : e= 6 : f= 9 : g= 4 : h= 15
: i= 12 : j= 7 : k= 14 : l= 1 : m= 13 : n= 2 : o= 11 : p= 8
33 a= 3 : b= 6 : c= 15 : d= 10 : e= 13 : f= 12 : g= 1 : h= 8
: i= 2 : j= 7 : k= 14 : l= 11 : m= 16 : n= 9 : o= 4 : p= 5
34 a= 3 : b= 13 : c= 8 : d= 10 : e= 6 : f= 12 : g= 1 : h= 15
: i= 9 : j= 7 : k= 14 : l= 4 : m= 16 : n= 2 : o= 11 : p= 5
35 a= 4 : b= 14 : c= 11 : d= 5 : e= 15 : f= 1 : g= 8 : h= 10
: i= 6 : j= 12 : k= 13 : l= 3 : m= 9 : n= 7 : o= 2 : p= 16
36 a= 4 : b= 15 : c= 10 : d= 5 : e= 14 : f= 1 : g= 8 : h= 11
: i= 7 : j= 12 : k= 13 : l= 2 : m= 9 : n= 6 : o= 3 : p= 16
37 a= 4 : b= 9 : c= 16 : d= 5 : e= 15 : f= 6 : g= 3 : h= 10
: i= 1 : j= 12 : k= 13 : l= 8 : m= 14 : n= 7 : o= 2 : p= 11
38 a= 4 : b= 15 : c= 10 : d= 5 : e= 9 : f= 6 : g= 3 : h= 16
: i= 7 : j= 12 : k= 13 : l= 2 : m= 14 : n= 1 : o= 8 : p= 11
39 a= 4 : b= 9 : c= 16 : d= 5 : e= 14 : f= 7 : g= 2 : h= 11
: i= 1 : j= 12 : k= 13 : l= 8 : m= 15 : n= 6 : o= 3 : p= 10
40 a= 4 : b= 14 : c= 11 : d= 5 : e= 9 : f= 7 : g= 2 : h= 16
: i= 6 : j= 12 : k= 13 : l= 3 : m= 15 : n= 1 : o= 8 : p= 10
41 a= 4 : b= 5 : c= 16 : d= 9 : e= 15 : f= 10 : g= 3 : h= 6
: i= 1 : j= 8 : k= 13 : l= 12 : m= 14 : n= 11 : o= 2 : p= 7
42 a= 4 : b= 15 : c= 6 : d= 9 : e= 5 : f= 10 : g= 3 : h= 16
: i= 11 : j= 8 : k= 13 : l= 2 : m= 14 : n= 1 : o= 12 : p= 7
43 a= 4 : b= 5 : c= 16 : d= 9 : e= 14 : f= 11 : g= 2 : h= 7
: i= 1 : j= 8 : k= 13 : l= 12 : m= 15 : n= 10 : o= 3 : p= 6
44 a= 4 : b= 14 : c= 7 : d= 9 : e= 5 : f= 11 : g= 2 : h= 16
: i= 10 : j= 8 : k= 13 : l= 3 : m= 15 : n= 1 : o= 12 : p= 6
45 a= 5 : b= 4 : c= 15 : d= 10 : e= 16 : f= 9 : g= 6 : h= 3
: i= 2 : j= 7 : k= 12 : l= 13 : m= 11 : n= 14 : o= 1 : p= 8
46 a= 5 : b= 16 : c= 3 : d= 10 : e= 4 : f= 9 : g= 6 : h= 15
: i= 14 : j= 7 : k= 12 : l= 1 : m= 11 : n= 2 : o= 13 : p= 8
47 a= 6 : b= 3 : c= 16 : d= 9 : e= 15 : f= 10 : g= 5 : h= 4
: i= 1 : j= 8 : k= 11 : l= 14 : m= 12 : n= 13 : o= 2 : p= 7
48 a= 6 : b= 15 : c= 4 : d= 9 : e= 3 : f= 10 : g= 5 : h= 16
: i= 13 : j= 8 : k= 11 : l= 2 : m= 12 : n= 1 : o= 14 : p= 7

目次