Comment detail

必ず解ける迷路 (Nested Flatten)
これは、ありですか?
一応、毎回ランダムに結果は変わるのですが。
実行結果:
 $ gosh 123.scm
xxxxxxxxxxx
x         x
x xxxxxxx x
x       x x
x xxxxxxx x
x       x x
x xxxxxxx x
x       x x
x xxxxxxx x
x       x x
xxxxxxxxxxx
 $ gosh 123.scm
xxxxxxxxxxx
x       x x
x xxxxxxx x
x       x x
x xxxxxxx x
x         x
x xxxxxxx x
x       x x
x xxxxxxx x
x       x x
xxxxxxxxxxx
 $ gosh 123.scm
xxxxxxxxxxx
x         x
x xxxxxxx x
x       x x
x xxxxxxx x
x       x x
x xxxxxxx x
x       x x
x xxxxxxx x
x       x x
xxxxxxxxxxx
 $
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
(use srfi-27)

(define (showmaze n m)
  (let1 x (random-integer m)
    (dotimes (i m)
      (display (if (= i 0) "xx" "x "))
      (dotimes (j (- n 2)) (display "xx"))
      (display (if (= i 0) "xxx\n" "x x\n"))
      (display "x ")(dotimes (j (- n 2)) (display "  "))
      (display (if (= i x) "  x\n" "x x\n")))
    (dotimes (j m) (display "xx")) (display "x\n")))

(define (main args)
  (random-source-randomize! default-random-source)
  (showmaze 5 5))
解いても楽しくない迷路になりそうですが、ルールは満たしていますね。
あと、めっちゃ速そう(笑)
速さには自信があります。(笑)
>限られたメモリを使って縦方向に無限に広い迷路を
>どうやって作るのかを考えると答えが見えてくると思います。
をすっごくまじめに考えて、最小のメモリで無限の迷路を作り出すことばかり考えていたら、
こんなふざけたアイデアしか思いつかなかったので。
すみません。

メモリ使用量はO(1)なので確かに理想的ですね。速さも文句なしです。でも、さすがにそこまでのメモリ効率は想定していませんでした(笑)

他のコメントにも書きましたが、O(n)のアルゴリズムがあるんですよ。解いて楽しい迷路生成のメモリ効率としてはそれ以上のアルゴリズムは無いと踏んでます。 時間のあるときにでも考えてみてください。

O(n)のアルゴリズムは、棒倒し法しか思いつかない。
穴掘り法はある程度、美しいんだけど、O(n^2)だし。

棒倒し法で棒を倒す方向を決定するのに、
周囲の環境を見て決めるように、パラメータチューニングするしかないのかなぁ。
と考え中。

↓は綺麗だけどお題を満たさない答え。 迷路(笑)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#include<stdio.h>
#include<stdlib.h>

int main()
{
    int x,y,n,m;
    n = 10;
    m = 20;

    for (y = 0; y < m; y++){
        for (x = 0; x < n; x++){
            printf(rand() > RAND_MAX / 2 ? "/" : "\");        
        }
        printf("\n");
    }
}

棒倒し法も空間計算量がO(n)なんですね。 O(nm)と勘違いしてました・・orz

ルールは満たしてませんが、見栄えのする迷路が出てきますね。

ルールについてよくわからないので質問します。
ルール1を満たさないのは、どういう場合ですか?
ルール2を満たさないのは、どういう場合ですか?
このプログラムがルールを満たしているということは、壁か、通路か未定の部分をあらかじめ
どちらかに固定した部分があってもよいということですか?
このプログラムを他の投稿プログラムと区別しているようにみえますが、ルール以外に
区別する「なにか」があるのですか?
ごめんなさい。ルールわかりにくかったですね。

> ルール1を満たさないのは、どういう場合ですか?

1. 格子状の迷路であること
このルールは立体交差、斜め経路、グニャグニャ経路等
を作らないでほしいという意図で作ったルールです。

> ルール2を満たさないのは、どういう場合ですか?

2. 経路の幅は均等であること。
このルールは以下のような迷路を作らないでほしいとい
う意図で作ったルールです。
■■■■■■■■■■■
■       ■ ■
■ ド ■ ■■■ ■
■ ォ ■ ■   ■
■ ォ ■■■■■ ■
■ ン ■     ■
■ ! ■ ■ 広 ■
■   ■ ■ 過 ■
■ ■ ■ ■ ぎ ■
■ ■   ■   ■
■■■■■■■■■■■

> このプログラムがルールを満たしているということは、
> 壁か、通路か未定の部分をあらかじめどちらかに固定
> した部分があってもよいということですか?

そのとおりです。
あらかじめの固定を禁止するルールを作らなかったのを
後悔しています(笑)

とはいえ、解いて面白い迷路が出来上がるなら固定もア
リかなと思ってます。
その点katsuさんのプログラムが作り出す迷路はあんまり
面白くなさそうなのでちょっと残念です。

> このプログラムを他の投稿プログラムと区別している
> ようにみえますが、ルール以外に区別する「なにか」
> があるのですか?

評価した人ごとに理由があると思いますが、おそらく
 ・解いて面白い迷路を作るべき
 ・固定を禁止するルールがある
といった思い込みを持っていたところに、思い込みに反
した解決策が示されて、
 「こりゃ一本とられたよ」
という気持ちが他の投稿プログラムと区別してるんじゃ
ないでしょうか?

私の方もうまく聞きたいことを伝えられないようで。
もうすこしだけ。下の例は、どうなりますか?
1         2         3
■■■■■  ■■■■■  ■■■■■
■□□□■  ■□■■■  ■□□□■
■■□■■  ■□■■■  ■□□□■
■□□□■  ■□□□■  ■□□□■
■■■■■  ■■■■■  ■■■■■


■■■■■■■■■■■
■□□□■□□□□□■
■□□□■□□□□□■
■□□□■□□□□□■
■□□□■■■□□□■
■□□□□□□□□□■
■□□□□□□□□□■
■□□□□□□□□□■
■■■■■■■■■■■

なんか空白にすると詰まってしまうので□にしました。
> もうすこしだけ。下の例は、どうなりますか?

あ~。理解しました。

下の大きさの迷路の場合、★の位置が必ず柱(通過不能)になることを望んでいます。
■■■■■■■■■■■
■□□□□□□□□□■
■□★□★□★□★□■
■□□□□□□□□□■
■□★□★□★□★□■
■□□□□□□□□□■
■□★□★□★□★□■
■□□□□□□□□□■
■■■■■■■■■■■
自分でも「格子状」っていう言葉を深く考えてませんでした。

また、塗りつぶされた領域ができないことも望んでいます。
■■■■■■■■■■■
■□□□□□□□■■■
■□■■■■■■■■■
■□■■■□■■■■■
■□■■■□■■■■■
■□□□□□□□□□■
■□★□★□★□★□■
■□□□□□□□□□■
■■■■■■■■■■■
こんなんとかダメです。
これは、到達不可能な箇所を壁にしてお茶を濁したと見ることもできますね。

ルールにボロが出てますね・・・orz
それでも、多くの人には一応意図が伝わってたみたいでよかった。
すばやい回答ありがとうございます。
やっとわかりました。

Index

Feed

Other

Link

Pathtraq

loading...