パズル問題解法のアルゴリズム講座
1から7の数字を書いたカードが2枚ずつ計14枚ある。
そしてこれを1列に並べ,2枚の1の間にはカードが1枚,
2枚の2の間にはカードが2枚はさまれていて,同様に,
3の間には3枚,4の間には4枚,5の間には5枚,6の間には
6枚,7の間には7枚のカードがはさまれるように14枚の
カードを並べて下さい。
この方針で強引に仮定から仮定へと突き進むと、右上図のようになる。
こんなことの繰り返しをプログラムに実行させようとすると次のようになります。
|
C言語ソースリスト
Javaアプレットの実行 |
backtrack()を最初に呼び出すのは、backtrack(1)です。
int LETSU[]; /* カードを置いていく列テーブル */
/* No.pのカードをいろいろ置いてみる(バックトラック) */
void backtrack(int p) {
int i; /* 左カードの位置 */
int j; /* 右カードの位置 */
if (p > 7) { /* 総てのカードが置かれている */
(配置を表示する等の処理:省略);
} else {
for (i=0, j=p+1; j < 14; i++, j++) {
if (LETSU[i]==0 && LETSU[j]==0) { /* カードを置けるなら */
LETSU[i] = LETSU[j] = p; /* カードを置く(仮定) */
backtrack(p+1); /* 再帰で次のNo.カードへ */
LETSU[i] = LETSU[j] = 0; /* 状態を元に戻す */
}
}
}
}