パズル(1):魔方陣の作り方 NSZAK HomePage!/Other/pazle-1 |
面白いパズルに関する雑記(更新、Jul. 1, 99) |
|Return|![]() |
◆魔方陣のとは
魔方陣とは、正方形升に数字を埋め込むと、縦・横・斜め(対角)の数字の合計が全て同じとなる組み合わせ
を言います。なかなか面白いでしょう。3x3程度なら、5x5程度なら辛抱すればできるが、それ以上ではちょっと大変。
そこで、そんなものを作る方法をお教えしましょう。
◆魔方陣の作り方(奇数サイズ)
魔方陣の作り方は、以下のルールでつくれます。 右図の様な5行、5列の碁盤のますを想定すると、
できた魔方陣の各要素は、同じ数を加算、減算、乗算、除算して も成立、小数、負の数などでも可能、当然ですね。 |
![]() |
◆ここをクリックすると実行例が見れるよ(ちょっと時間がかかる,1、2秒)
◆具体的なプログラムサンプル(JavaScriptです)
-----------ここから切り取ってxx.htmファイルとして保全して動くよ----------- <SCRIPT language="JavaScript"> <!-- 配列関数と2次元配列を1次元配列に添え字変換関数定義 function MakeArray(n){ this.length=n; } function idx(i,j,n){ ij=(i-1)*n+j; return ij; } // --> </SCRIPT> <SCRIPT language="JavaScript"> <!-- 魔方陣計算の本体、関数としている function mahojin(n){ nn=n*n; document.write("<h2> nn=",nn,"<br></h2>"); var a=new MakeArray(nn); for(jj=1; jj<=nn; jj++){ a[jj]=0; } i=1; j=Math.ceil((n+1)/2); id=idx(i,j,n); a[id]=1; document.write("@<br>") for(m=2; m<=nn; m++){ ii=i; jj=j; mm=m; flg=0; ///左下が配置可能/// if(i-1>0 && j-1>0 && flg==0){ id=idx(i-1,j-1,n); if(a[id]<1){ i=i-1; j=j-1; id=idx(i,j,n); a[id]=m; flg=1; } ///左下が配置不可/// else { i=i+1; id=idx(i,j,n); a[id]=m; flg=1; } } ///左枠が欄外/// if(i-1>0 && j-1<1 && flg==0){ id=idx(i-1,n,n); if( a[id]<1 ){ i=i-1; j=n; id=idx(i,j,n); a[id]=m; flg=1; } } ///下枠が欄外/// if(i-1<1 && j-1>0 && flg==0){ id=idx(n,j-1,n); if(a[id]<1){ i=n; j=j-1; id=idx(i,j,n); a[id]=m; flg=1; } } ///左枠および下枠が欄外/// if(i-1<1 && j-1<1 && flg==0){ id=idx(i+1,j,n); if(a[id]<1){ i=i+1; id=idx(i,j,n); a[id]=m; flg=1; } } } ///魔方陣の表示/// document.write("<table border>"); for(i=n; i>0; i=i-1){ document.write("<tr>"); for(j=1; j<=n; j=j+1){ id=idx(i,j,n); document.write("<td><h2><font color=blue>",a[id],"</h2></td></font>"); } document.write("</tr>"); } document.write("</table><p>"); } ///上記関数を使い複数枠の大きさに対して表示/// document.write("<table border><tr>"); document.write("<td><h2><font color=green>魔方陣 n=3*3</font></h2></td>"); document.write("<td><h2><font color=green>魔方陣 n=5*5</font></h2></td>"); document.write("<td><h2><font color=green>魔方陣 n=7*7</font></h2></td>"); document.write("</tr><tr><td>"); mahojin(3); document.write("</td><td>"); mahojin(5); document.write("</td><td>"); mahojin(7); document.write("</td></tr></table>"); // --> </SCRIPT> --------------------ここまで----------------