ASSIT09で、8-Queens ― 2023年12月21日 17:18
![](http://kida.asablo.jp/blog/img/2023/12/21/6a59dd.jpg)
8-Queensを解くプログラムです。これは、8x8のマスにお互いが鑑賞しないようにQueenのコマの配置を求めるプログラムです。オリジナルで作成しようと頑張ったのですが、行き詰まってしまいました。いつものように、先人の方々のお知恵を拝借しました。調べてみると、ヴィルトの「アルゴリズム+データ構造=プログラム」にPascalで書かれたスマートな解がありました。暑中参照している「マイクロコンピュータのプログラミング」にもMicroPlanでの解が掲載されています。このMicroPlanの解を参照して、プログラムを作成しました。
さて、下敷きにしたプログラムは、Queenの配置を求めるルーチンが再帰的に書かれています。これをMC6809のアセンブラで書き下すのがキーポイントでしょう。想像しているより簡単に実現できました。MC6809にはスタックが、システムスタック Sとユーザースタック Uの2つがあります。このユーザースタックに、再帰的関数内部のローカル変数を退避させることでうまく行きました。 プログラム、アセンブルリスト、実行結果などは、こちらです。 8Queen.zip
いつものように、Lコマンドでロード・モジュールをダウンロードし、Cコマンドで、C000から実行させます。
Queenの配置が、次々と出てきます。
=== 8 Queens === 0 4 7 5 2 6 1 3 0 5 7 2 6 3 1 4 0 6 3 5 7 1 4 2 0 6 4 7 1 3 5 2 1 3 5 7 2 0 6 4 1 4 6 0 2 7 5 3 1 4 6 3 0 7 5 2 : : :例えば、"0 4 7 5 2 6 1 3"は、
カラム 0のQueenは、ロウ 0に カラム 1のQueenは、ロウ 4に カラム 2のQueenは、ロウ 7に カラム 3のQueenは、ロウ 5に カラム 4のQueenは、ロウ 2に カラム 5のQueenは、ロウ 6に カラム 6のQueenは、ロウ 1に カラム 7のQueenは、ロウ 3ににあることを示しています。こんな配置です。
0 1 2 3 4 5 6 7 0 Q . . . . . . . 1 . . . . . . Q . 2 . . . . Q . . . 3 . . . . . . . Q 4 . Q . . . . . . 5 . . . Q . . . . 6 . . . . . Q . . 7 . . Q . . . . .
最近のコメント