LoginSignup
4
2

More than 5 years have passed since last update.

3x3の魔方陣を作るプログラム

Last updated at Posted at 2017-12-12

3x3の魔方陣とは

3x3の表組みに1から9の数字をすべて埋めます。
条件は、縦・横・斜めの数字の和がすべて同じ値になることです。

スクリーンショット 2017-12-12 12.53.05.png

コード

<html>
<head>
<title>魔方陣</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){

    var n = 3;  // 3x3魔方陣

    // 1辺の和
    var x = 0;
    for (i = 1; i <= n*n; i++) {
        x += i;
    }
    x = x / n;

    // 和がXになる数字の組み合わせを探す
    var y = [];
    for (i = 1; i <= n*n; i++) {
        for (j = i + 1; j <= n*n; j++) {
            for (k = j + 1; k <= n*n; k++) {
                if ((i + j + k) == x) {
                    y.push([i, j, k]);
                    continue;
                }
            }
        }
    }

    // 各数字の使用回数を調べる
    var c = [];
    for (i = 1; i <= n*n; i++) {
        c[i] = 0;   // 初期化
    }
    for (i = 0; i < y.length; i++) {
        for (j = 1; j <= n*n; j++) {
            if (j == y[i][0] || j == y[i][1] || j == y[i][2]) {
                c[j]+=1;
            }
        }
    }

    // 使用回数が最も多い数字を魔方陣の中心にする
    var m = [];
    m['e'] = 0;
    for (i = 1, j = 0; i < c.length; i++ ) {
        if (c[i] > j) {
            j = c[i];
            m['e'] = i;
        }
    }

    // 次に使用回数が多い数字を魔方陣の4隅にする
    var k = []
    for (i = 1, j = 0; i < c.length; i++ ) {
        j = c[m['e']] - 1;
        if (c[i] == j) {
            k.push(i);
        }
    }
    m['a'] = k[0];
    m['c'] = k[1];
    m['g'] = k[2];
    m['i'] = k[3];

    // 残りの数字を確定する
    m['b'] = x - m['a'] - m['c'];
    m['d'] = x - m['a'] - m['g'];
    m['f'] = x - m['c'] - m['i'];
    m['h'] = x - m['g'] - m['i'];

    // 描画
    $("#a").html(m['a']);
    $("#b").html(m['b']);
    $("#c").html(m['c']);
    $("#d").html(m['d']);
    $("#e").html(m['e']);
    $("#f").html(m['f']);
    $("#g").html(m['g']);
    $("#h").html(m['h']);
    $("#i").html(m['i']);

});
</script>
<style>
table {
    border-collapse: collapse;
}

td {
    border: 1px #333 solid;
    padding: 5px 10px;
}
</style>
</head>
<body>
<table>
    <tr>
        <td id="a">a</td>
        <td id="b">b</td>
        <td id="c">c</td>
    </tr>
    <tr>
        <td id="d">d</td>
        <td id="e">e</td>
        <td id="f">f</td>
    </tr>
    <tr>
        <td id="g">g</td>
        <td id="h">h</td>
        <td id="i">i</td>
    </tr>
</table>
</body>
</html>
4
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2