LoginSignup
1
0

More than 3 years have passed since last update.

Kinx アルゴリズム - エイト・クイーン

Posted at

Kinx アルゴリズム - エイト・クイーン

はじめに

「見た目は JavaScript、頭脳(中身)は Ruby、(安定感は AC/DC)」 でお届けしているスクリプト言語 Kinx。「プログラム=アルゴリズム+データ構造」。アルゴリズムの実装例をご紹介。

元ネタは「C言語による(30年経っても)最新アルゴリズム事典」。今回はエイト・クイーン(一般的には N Queens)です。

最新アルゴリズム事典にはこういうのも結構載ってる。パズル的な。

エイト・クイーンも Kinx の最初のころにサンプルを作り、ちゃんと 92 通りの解が出せるか確認に使った。

エイト・クイーン

Wikipedia より

エイト・クイーンとは、チェスの盤とコマを使用したパズルの名称である。
チェスの盤上に、8個のクイーンを配置する。このとき、どの駒も他の駒に取られるような位置においてはいけない。

尚、この 8 個を n 個に拡張 したのが N Queens です。

ソースコード

var a = [], b = [], c = [], x = [];
var solution = 0;

function found(n) {
    System.print("\nSolution %d\n" % ++solution);
    for (var i = 0; i < n; i++) {
        for (var j = 0; j < n; j++)
            if (x[i] == j) System.print(" Q");
            else           System.print(" .");
        System.print("\n");
    }
}

function test(i, n) {
    for (var j = 0; j < n; j++)
        if (a[j] && b[i + j] && c[i - j + n - 1]) {
            x[i] = j;
            if (i < n - 1) {
                a[j] = b[i + j] = c[i - j + n - 1] = 0;
                test(i + 1, n);
                a[j] = b[i + j] = c[i - j + n - 1] = 1;
            } else found(n);
        }
}

function nqueen(n) {
    for (var i = 0; i < n; i++)         a[i] = 1;
    for (var i = 0; i < 2 * n - 1; i++) b[i] = 1;
    for (var i = 0; i < 2 * n - 1; i++) c[i] = 1;
    test(0, n);
}

nqueen(8);

結果

Solution 1
 Q . . . . . . .
 . . . . Q . . .
 . . . . . . . Q
 . . . . . Q . .
 . . Q . . . . .
 . . . . . . Q .
 . Q . . . . . .
 . . . Q . . . .

Solution 2
 Q . . . . . . .
 . . . . . Q . .
 . . . . . . . Q
 . . Q . . . . .
 . . . . . . Q .
 . . . Q . . . .
 . Q . . . . . .
 . . . . Q . . .

Solution 3
 Q . . . . . . .
 . . . . . . Q .
 . . . Q . . . .
 . . . . . Q . .
 . . . . . . . Q
 . Q . . . . . .
 . . . . Q . . .
 . . Q . . . . .

...(省略)

Solution 92
 . . . . . . . Q
 . . . Q . . . .
 Q . . . . . . .
 . . Q . . . . .
 . . . . . Q . .
 . Q . . . . . .
 . . . . . . Q .
 . . . . Q . . .

おわりに

これもほぼほぼ C 言語版ほぼそのままです。

こういうのがちゃんと動くと「うまくいってる感」があって前に進んでる感じがしてました、と当時を思い出す。やっぱり配列要素のアクセスとインクリメント・デクリメントあたりがきちんと動くようになった時が色々できるようになる最初の一歩でしたね。

ではまた、次回。

1
0
0

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
1
0