パズル(1):魔方陣の作り方
NSZAK HomePage!/Other/pazle-1
面白いパズルに関する雑記(更新、Jul. 1, 99)
|Return|
---------------------------------------------------------------------

魔方陣のとは
魔方陣とは、正方形升に数字を埋め込むと、縦・横・斜め(対角)の数字の合計が全て同じとなる組み合わせ
を言います。なかなか面白いでしょう。3x3程度なら、5x5程度なら辛抱すればできるが、それ以上ではちょっと大変。
そこで、そんなものを作る方法をお教えしましょう。

魔方陣の作り方(奇数サイズ)
  

魔方陣の作り方は、以下のルールでつくれます。
右図の様な5行、5列の碁盤のますを想定すると、
  1. 1行目の中央この場合3列目をスタートの1とする。
  2. 次の数字を左斜め左(現在地より1行、1列下がった
    所)に配置する。但し、枠外へのはみだし、既に数字
    が置かれている場合は、以下に従う。
  3. 枠外にはみ出し:
    上のはみ出した行と同じ位置または右のはみ出した
    同じ列の所にはみ出した数字を配置。
    (右図の2、9、25、18や17、10、4など)
  4. 既に数字が置かれている:
    既に置かれている数字と同じ列の一つ上の行に配置。
    (右図の6、21、11など)
  5. 1行1列の次:
    1行1列の次は、上記と同じ2行1列に置く。
但し、奇数枠の魔方陣のみ、偶数はだめ。
できた魔方陣の各要素は、同じ数を加算、減算、乗算、除算して
も成立、小数、負の数などでも可能、当然ですね。


ここをクリックすると実行例が見れるよ(ちょっと時間がかかる,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>
--------------------ここまで----------------



* Return(Other)


Copyright (C) http://www7b.biglobe.ne.jp/~nszak-bee/
(nszak@sun-inet.or.jp) All Rights Reserved.
Last-Madified: Jul. 1 '99