[Background]

現在友人三人と以下にある "Structure and Interpretation of Computer Programs" という本 (SICP と呼んでいます。いわゆる「魔術師本」) の日本語訳でゼミをしています。簡単に言うとプログラミング言語のひとつである LISP の方言である Scheme について書きながらアルゴリズムの設計の仕方やデータ構造についても説明がなされている本です。

github.com

練習問題の答えをメモ代わりに貼っているブログもあります。

sicp-zemi.hatenablog.jp

ここにある練習問題 2.42 がなかなか面白かったのでいろいろ遊んでみました。

まず問題は、 "8 queens puzzle" と呼ばれるもので、 8×8 マスのチェス盤の上に 8 個のクイーンを置くのですが、その 8 つのクイーンが互いに「利き筋に入らない」 (クイーンは行・列・対角線上を移動できるので、その道筋上に他のクイーンがいない) ような配置の仕方を考える、というものです。チェス盤の行・列の数とクイーンの数を n と一般化した問題を考えます。

では実際に、SICP の誘導どおりに解き方を考えます。

簡単に一言で説明しちゃうと、帰納法で解きます。つまり、まず k-1 列目まで、条件を満たすように k-1 個のクイーンが配置されていると仮定します。この条件の下で、 k 列目のどこにクイーンを置けばよいか考えます。 k 列目の 1 行目から n 行目、座標で表すと (1, k)~(n, k) のそれぞれについてクイーンを置いてみて、利き筋に入らないという条件を満たすか調べてみて、条件を満たすものだけを取り出す、こうすると k 列目までに k 個のクイーンが条件を満たして置かれた配置ができます。これを k = 1~n まで行えば完了というわけです。

SICP ではこれを解いて Scheme のデータ構造であるリスト表現を出力すれば終わりとなっているのですが、少し結果がわかりづらいので出力を可視化するコードも書いてみました。



