squld #5301(2008/01/13 14:26 GMT) Rating2/2=1.00
棒倒し法も空間計算量がO(n)ですね。 すみません勘違いしてました。 私の考えたアルゴリズムと同じです。 棒倒し法の1行バッファ版と言えるようです。 以下、n=5, m=5の迷路の例でアルゴリズムを解説します。 ・最初の行 S■■■■■■■■■■■← まずバッファを用意して、全て壁にします。 ・1行目(奇数行) S■■■■■■■■■■■ 1■★■★■★■★■★■← ★の箇所に穴を開けます。 S■■■■■■■■■■■ 1■A■B■C■D■E■← 穴を開けた場所をA~Eとします。 S■■■■■■■■■■■ 1■A★B★C★D★E■← ★の箇所に穴を開けるかどうかを乱数で決定します。 S■■■■■■■■■■■ 1■A▲B★C★D★E■← たとえば▲に穴を開ける場合。 S■■■■■■■■■■■ 1■AAA★C★D★E■← AとBの領域が結合されるため、B領域をA領域に統合します。 仮にB領域に飛び地があっても、それもA領域に統合します。 また、★の左右が同じ領域だった場合は、穴を開けてはいけません。 ループ経路が出来てしまうからです。 S■■■■■■■■■■■ 1■AAAAAAA■E■← この調子で穴を開けていきます。 全ての★を乱数で決定したら1行確定です。 ・2行目(偶数行) S■■■■■■■■■■■ 1■AAAAAAA■E■ 2■A☆A☆A☆A★E■← ☆の箇所を壁にします。 S■■■■■■■■■■■ 1■AAAAAAA■E■ 2■A■A■A■A■E■← ★の箇所はすでに壁なので特に何もしません。 S■■■■■■■■■■■ 1■AAAAAAA■E■ 2■☆■☆■☆■☆■E■← ☆の箇所を壁にするかどうかを乱数で決定します。 ただし、残り1つになっているEの列は壁になってはいけません。 また、4つの☆は3つまでは壁にしてもよいですが、 最後のひとつは壁にしてしてはいけません。 4つとも壁にしてしまうと S■■■■■■■■■■■ 1■AAAAAAA■E■ 2■■■■■■■■■E■← こうなって、Aの領域に侵入できなくなってしまうからです。 S■■■■■■■■■■■ 1■AAAAAAA■E■ 2■A■■■A■■■E■← 乱数を使って結局2箇所を壁にすることになりました。 全ての☆を乱数で決定したら1行確定です。 ・3行目(奇数行) S■■■■■■■■■■■ 1■AAAAAAA■E■ 2■A■■■A■■■E■ 3■A■★■A■★■E■← 1行目と同じく、★の箇所に穴を開けてB,C領域と します。 S■■■■■■■■■■■ 1■AAAAAAA■E■ 2■A■■■A■■■E■ 3■A★B★A★C★E■← ★の箇所に穴を開けるかどうかを乱数で決定します。 あとは同じように、 偶数行→奇数行→偶数行→・・・ と繰り返します。 ・9行目(最後の一つ前の行&奇数行) S■■■■■■■■■■■ 1■AAAAAAA■E■ 2■A■■■A■■■E■ 3■AAA■A■CCC■ 4■■■A■■■■■C■ 5■B■A■DDD■C■ 6■B■A■D■D■C■ 7■AAA■C■CCC■ 8■A■A■C■C■C■ 9■A■A■C■C■C■← 最後の一つ前の行は辻褄あわせが必要です。 具体的には、すべての領域を統合しなければなりません。 S■■■■■■■■■■■ 1■AAAAAAA■E■ 2■A■■■A■■■E■ 3■AAA■A■CCC■ 4■■■A■■■■■C■ 5■B■A■DDD■C■ 6■B■A■D■D■C■ 7■AAA■C■CCC■ 8■A■A■C■C■C■ 9■A■A★C■C■C■← 今回は、たまたまA領域とC領域しかないため、 ★の箇所の壁を取り除けばOKです。 S■■■■■■■■■■■ 1■AAAAAAA■E■ 2■A■■■A■■■E■ 3■AAA■A■CCC■ 4■■■A■■■■■C■ 5■B■A■DDD■C■ 6■B■A■D■D■C■ 7■AAA■C■CCC■ 8■A■A■C■C■C■ 9■A★A☆C★C★C■ ★☆の箇所に穴を開けるか乱数で決定します。 S■■■■■■■■■■■ 1■AAAAAAA■E■ 2■A■■■A■■■E■ 3■AAA■A■CCC■ 4■■■A■■■■■C■ 5■B■A■DDD■C■ 6■B■A■D■D■C■ 7■AAA■C■CCC■ 8■A■A■C■C■C■ 9■A■AAA★A★A■ ☆確定まで。 この例では、☆以外はたまたま左右が同じ領域なので、 選択肢がありません。 S■■■■■■■■■■■ 1■AAAAAAA■E■ 2■A■■■A■■■E■ 3■AAA■A■CCC■ 4■■■A■■■■■C■ 5■B■A■DDD■C■ 6■B■A■D■D■C■ 7■AAA■C■CCC■ 8■A■A■C■C■C■ 9■A■AAA■A■A■ A領域とC領域が統合されたため、 残りの★も穴をあけられなくなりました。 ・最後の行 S■■■■■■■■■■■ 1■AAAAAAA■E■ 2■A■■■A■■■E■ 3■AAA■A■CCC■ 4■■■A■■■■■C■ 5■B■A■DDD■C■ 6■B■A■D■D■C■ 7■AAA■C■CCC■ 8■A■A■C■C■C■ 9■A■AAA■A■A■ E■■■■■■■■■■■ 全て壁で埋めます。 これでおしまいです。 私の書いたJavaコードだと出力無しで1372ミリ秒でした。 PentiumM 2.1GHz java version "1.6.0_02" Java(TM) SE Runtime Environment (build 1.6.0_02-b05) Java HotSpot(TM) Server VM (build 1.6.0_02-b05, mixed mode)
1 reply [ reply ]
squld
#5301()
Rating2/2=1.00