読者です 読者をやめる 読者になる 読者になる

エイト・クイーン

エイト・クイーン - Wikipedia のプログラムを書いてみました。

using System;

class Loc {
    public int Row { get; private set; }
    public int Col { get; private set; }
    public Loc(int row, int col) {
        Row = row;
        Col = col;
    }
}

class EightQueen {
    static void Display(Loc[] g) {
        int n = g.Length;
        for (int i = 0; i < n; i++) {
            Loc loc = g[i];
            for (int j = 0; j < n; j++) {
                Console.Write(loc.Col == j ? "Q" : ".");
            }
             Console.WriteLine();
        }
        Console.WriteLine();
    }

    static bool IsConflict(Loc loc, int n, Loc[] g) {
        for (int i = 0; i < n; i++) {
            // 縦/横でぶつかる
            if (loc.Row == g[i].Row || loc.Col == g[i].Col)
                return true;

            // ななめでぶつかる
            if (Math.Abs(loc.Row - g[i].Row) == Math.Abs(loc.Col - g[i].Col))
                return true;
        }
        return false;
    }

    static int Calc(int row, int n, Loc[] g) {
        if (row == n) {
            Display(g);
            return 1;
        }

        int ret = 0;
        for (int i = 0; i < n; i++) {
            var loc = new Loc(row, i);
            if (!IsConflict(loc, row, g)) {
                g[row] = loc;
                ret += Calc(row+1, n, g);
            }
        }
        return ret;
    }

    static void Queen(int n) {
        int ans = Calc(0, n, new Loc[n]);
        Console.WriteLine("n:{0} {1}", n, ans);
    }

    static void Main() {
        Queen(8);
    }
}

実行結果です。

Q.......
....Q...
.......Q
.....Q..
..Q.....
......Q.
.Q......
...Q....

Q.......
.....Q..
.......Q
..Q.....
......Q.
...Q....
.Q......
....Q...

(省略)

.......Q
...Q....
Q.......
..Q.....
.....Q..
.Q......
......Q.
....Q...

n:8 92