Add tags

Add tags to the following comment
棒倒し法も空間計算量が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)

Add tags

The input will be splited to tags with space.

Index

Feed

Other

Link

Pathtraq

loading...