![](https://habrastorage.org/files/ec0/af2/8bf/ec0af28bf45241ee9de2add7bf33e87b.png)
ãŸããã
â åå
ã ããã HabrãªãŒãã£ãšã³ã¹ã®åå¿ãè©äŸ¡ããåé¡ãæŽçãããµã€ã¯ã«ã®2çªç®ã®èšäºãæžãå§ããŸããã 倧è¡ã®åå¿ã¯ç§ã®æ³å®ãããã¯ããã«è¯å®çã§ãããã€ãŸããæç¶ãçæã®æãèå³æ·±ããããã¯ã®1ã€ã§ããè¿·è·¯ã®äœæã«ã€ããŠäŒè©±ãç¶ããŠããŸãã
ãã®ããŒãã§ã¯ãã©ã³ãã ããã³æ¬äŒŒã©ã³ãã çæãšã¯äœããã¢ã«ãŽãªãºã ã¯äºãã«åçã«ç°ãªãè¿·è·¯ãäžããããšãã§ãããã®ãããã³ãããã®äžå©ãªç¹ã«ã€ããŠèª¬æããŸãã ä»æ¥ã®åéºã®ããŒããŒã¯ããŠã£ã«ãœã³ã¢ã«ãŽãªãºã ãšã©ã³ãã ã¹ããã³ã°ããªãŒïŒåäžã¹ããã³ã°ããªãŒïŒãäœæããããã®Aldous-Broderã¢ã«ãŽãªãºã ã§ãã 泚æãã©ãã£ã㯠ã
åé¡ã®çæ³çãªè¿·è·¯ãäœã§ããããæãåºããŸãããã ã°ã©ãã®åé ç¹ããä»ã®é ç¹ãŸã§æ£ç¢ºã«1ã€ã®ãã¹ããããåããšããžã2åééããã«ãã¹ãŠã®é ç¹ãééã§ããªãå Žåããã®ãããªã°ã©ããã¹ããã³ã°ããªãŒãšåŒã³ãŸã ã åã»ã«ããä»ã®ã»ã«ãžã®æ€èšäžã®ã©ããªã³ã¹ã§ãæ£ç¢ºã«1ã€ã®éè·¯ããããåãå»äžã2åééããããšãªããã¹ãŠã®ã»ã«ã蚪ããããšãã§ããªãå Žåããã®ãããªã©ããªã³ã¹ãçæ³çã§ãããšèšããŸãã æå³ã¯1ã€ã®ç°¡åãªçç±ã§å€ãããŸãããè¿·å®®ã¯ã°ã©ãã§ãããåã®èšäºã§æžããŸããã ãŸã èªãã§ããªãå Žåã¯ãå ã«é²ãåã«ããå°ãäžã«ã¹ã¯ããŒã«ãããªã³ã¯ããã©ã£ãŠãããããç解ããããšã匷ããå§ãããŸãã
ãŸãããã®ããŒãã§çŽ¹ä»ããã¢ã«ãŽãªãºã ã¯éåžžã«äœéã§ãæããªããã®ã§ããããããã¯å šäœããã³ç§ã®ãã¹ãŠã®èšäºã®åºç€ã§ããããã察åŠããå¿ èŠããããŸãã ç§ãããã«åœŒãããå§ããªãã£ãäž»ãªçç±ã¯ããŠã£ã«ãœã³ã¯åå¿è ã«ãšã£ãŠéåžžã«ç°¡åã«å®è£ ããã³ç解ããããšãã§ãããããã圌ã®æ¥µç«¯ãªå¥œå¥å¿ã劚ãããã®ã§ã¯ãªãããã§ãã
Luaã«ã€ããŠ
ãŠã£ã«ãœã³ã®ã¢ã«ãŽãªãºã ããããŠãããããç§ãæžããŠããä»ã®ããã€ãã®ã¢ã«ãŽãªãºã ã§ã¯ã次ã®ïŒããŒãã«[ãã€ã³ããã¯ã¹]ïŒé¢æ°ã䜿çšããŠããŸã ã¢ã¯ã»ã¹ãããŠããªãã©ã³ãã ãªã»ã«ãéžæããŸãã ãã®èª¬æã¯ãLuaã®å
¬åŒããã¥ã¡ã³ãããã®ãã®ã§ãã
ãããã£ãŠãmath.randomã䜿çšããŠã»ã«ãéžæããåŠçããããã©ããã確èªããããã¹ã¿ãã¯ããŒãã«ã®ã¹ã¿ãã¯ã䜿çšããŠããã·ã¥ããŒãã«ã§ãã®å Žæã远跡ãã代ããã«ã座æšã§ããã·ã¥ãããããŒã1ã€ã ã䜿çšã§ããŸã次ããèŠçŽ ãåãåºããŸãã
ã¢ããªã±ãŒã·ã§ã³ãããŒãã«å ã®ãã¹ãŠã®ãã£ãŒã«ããååŸã§ããããã«ããŸãã æåã®ãã©ã¡ãŒã¿ãŒã¯ããŒãã«ã2çªç®ã¯ãã®ããŒãã«ã®ã€ã³ããã¯ã¹ã§ãã nextã¯ãããŒãã«å ã®æ¬¡ã®ã€ã³ããã¯ã¹ãšããã«å¯Ÿå¿ããå€ãè¿ããŸãã 2çªç®ã®ãã©ã¡ãŒã¿ãŒãnilã®å Žåãnextã¯éå§ã€ã³ããã¯ã¹ãšããã«é¢é£ä»ããããå€ãè¿ããŸãã æåŸã®ã€ã³ããã¯ã¹ãåŒã³åºããããšãããŸãã¯ç©ºã®ããŒãã«ã«nilãããå Žåãnextã¯nilãè¿ããŸãã 2çªç®ã®ãã©ã¡ãŒã¿ãŒãæ¬ èœããŠããå ŽåãnilãšããŠè§£éãããŸãã ç¹ã«ãnextïŒtïŒã䜿çšããŠãããŒãã«ã空ãã©ããã確èªã§ããŸãã
ãããã£ãŠãmath.randomã䜿çšããŠã»ã«ãéžæããåŠçããããã©ããã確èªããããã¹ã¿ãã¯ããŒãã«ã®ã¹ã¿ãã¯ã䜿çšããŠããã·ã¥ããŒãã«ã§ãã®å Žæã远跡ãã代ããã«ã座æšã§ããã·ã¥ãããããŒã1ã€ã ã䜿çšã§ããŸã次ããèŠçŽ ãåãåºããŸãã
key = next(cellsHash, nil) local start_x, start_y = aux.deHashKey(key) cellsHash[key] = nil â , nil /
å€äœãšã©ã³ãã æ§
ã©ã³ãã çæãšã¯ã©ãããæå³ã§ããïŒ 2çªç®ã®ã©ããªã³ã¹ã§ã1çªç®ãšã¯ç°ãªããåã«2ã€ã®å£ããªãå Žåããããã¯å®å šã«ã©ã³ãã ã§ãããšèšããŸããïŒ ãŸãã¯ãæåã®è¿·è·¯ã«ããã«2ã€ã®æ°Žå¹³éè·¯ãããå Žåã¯ã©ãã§ããããïŒ ã¯ãããããã
ã©ããªã³ã¹ã®ã©ã³ãã æ§ãšããã°ãç§ãã¡ãäœãæå³ããã®ããæ確ã«èªèããªããã°ãªããŸããã äºåæšã¢ã«ãŽãªãºã ã®çµæãèŠãŠã¿ãŸãããïŒ
![](https://habrastorage.org/files/1f3/f7d/90f/1f3f7d90f0ee4fbba511eaf6c9042dd3.png)
![](https://habrastorage.org/files/b33/7fd/dcc/b337fddcc18f4f6f9d1690e137c95003.png)
ã芧ã®ãšãããã©ããªã³ã¹èªäœã¯å®å šã«ç°ãªããŸãããå€äœã¯ãããã«ç°ãªããŸãã
ã©ã³ãã ãªçµæãåŸãããŸãããïŒ ã¯ã 圌ããã®ããã«èããããšã¯ã§ããŸããïŒ ãŸããç§ã®æèŠã§ã¯ããããã
åé¡ã¯ãã€ã¢ã¹ã§ããããããäž»ã«ãã©ã³ãã æ§ãã決å®ããŸãã å®çŸ©äžãã©ã³ãã ãªè¿·è·¯ãäœæããæçµçã«åæ§ã®è¿·è·¯ãäœæããã¢ã«ãŽãªãºã ã ãã€ããªããªãŒã®ããã«ãé¡äŒŒæ§ããçºé³ãããå Žåããã®ãããªè¿·è·¯ã¯ç°¡åã«è§£æ±ºããããšèšããŸãã ããã€ãã®ã©ããªã³ã¹ãæ¯èŒãããšãã«ãã¢ã«ãŽãªãºã ãäœã«åŒãä»ããããããæ確ã«èšãããšãé£ããå Žåããã®ãããªã©ããªã³ã¹ã解決ããã®ã¯ããé£ãããšèšããŸãã ãã€ã¢ã¹ãèŠã€ããã«ã¯ãçæã®ããã€ãã®çµæãæ¯èŒãããã®ã¿ã€ãã®è¿·è·¯ã解決ããããã«ãããã¹ããŒããªãã¹ãŸãã¯èªåèªèº«ã®æ€çŽ¢ãäœæã§ããçµ±èšã¢ãã«ãæ§ç¯ããå¿ èŠããããŸãã ããšãã°ãäºåæšã¢ã«ãŽãªãºã ã«ã¯ãåçŽæ¹åã®éè·¯ã®nåã®æ°Žå¹³æ¹åã®éè·¯ããããšèšããŸãã ããã¯ãããŒã¿ãèæ ®ã«å ¥ããŠãåºå£ãèŠã€ããããã»ã¹ãé«éåã§ããããšãæå³ããŸãã
ãããããã€ã¢ã¹ããŸã£ããå¿ èŠãšããªãå Žåã¯ã©ãã§ããããïŒ ããšãã°ãã°ã©ãã®æ¥ç¶ãããŠããªã9åã®ãã€ã³ããããä»ãšã¯ãŸã£ããç°ãªãã¹ããã³ã°ããªãŒãååŸãããã³ã«ã 次ã«ãã¢ã«ãŽãªãºã ã®åæ¹åãåçã«ãªãå¿ èŠããããŸãã ããã¯ããã§ã«å®äºããããŒã¯ãééã§ããããšãæå³ããŸãããããã£ãŠããµã€ã¯ã«ã®åå埩ã§ãããã«ãããã©ããã«é¢ä¿ãªãã4ã€ã®æ¹åã®ãããããã©ã³ãã ã«éžæããŸãã å¯äžã®æ¡ä»¶ã¯ããã£ãŒã«ããè¶ ããªãããšã§ãã
çšèªãŠããã©ãŒã ã¹ããã³ã°ããªãŒãšããã°ã ã¹ããã³ã°ããªãŒãäœã§ãããã¯æ¢ã«ããã£ãŠããŸãã ã°ã©ãã®ãã¹ãŠã®é ç¹ããšããžã§æ¥ç¶ããåããšããžã2åééããã«é ç¹ããå¥ã®é ç¹ã«å°éã§ããªãããã«ãããšãã¹ããã³ã°ããªãŒãäœæãããŸãã ããããã°ã©ãã«3ã€ä»¥äžã®é ç¹ãããå Žåãããã«å€ãã®ããªãŒããªãšãŒã·ã§ã³ããããããããŸããã ãã®ãããåäžã¹ããã³ã°ããªãŒã¯ãç¹å®ã®ã°ã©ãã«ãããã¹ããã³ã°ããªãŒã®ããªãšãŒã·ã§ã³ã®1ã€ã§ãã
ãªã©ã äºãã«å®å šã«ç°ãªãå®å šã«ã©ã³ãã ãªã©ããªã³ã¹ãå¿ èŠã§ãããé床ãç ç²ã«ããæºåããã§ããŠããŸãã ããã§ã¯ãAldous-Broderã¢ã«ãŽãªãºã ãšWilsonã¢ã«ãŽãªãºã ã«ã€ããŠç解ããŸãããã
Aldous-Broderã¢ã«ãŽãªãºã
![](https://habrastorage.org/files/ea9/699/e97/ea9699e97af847d8ae245a20212cdcf7.png)
![](https://habrastorage.org/files/c19/bf3/0e7/c19bf30e7b8341ee817b014c559e7fe2.png)
![](https://habrastorage.org/files/084/f65/5b4/084f655b45044098919550948e35f60a.gif)
![](https://habrastorage.org/files/9f7/838/76a/9f783876affb4a24ba271affe8a3e3ab.gif)
説æ
äºåæšã¢ã«ãŽãªãºã ãæãç解ãããããšèšã£ãããšãèŠããŠããŸããïŒ ã ãããç§ã¯cã§ããã åžžã«èæ ®ããŠããã®ã¯1ã€ã®æ¹åãš1ã€ã®åŽé¢ã®ã¿ãæ±ããããå®è£ ã¯éåžžã«ç°¡åã§ãããåå§æ§ãšãæãããã§ã¯Aldous-Broderã¢ã«ãŽãªãºã ãã¯ããã«é²ãã§ããŸãã ãã®å šäœã®ãã€ã³ãã¯ãäœæãããã¹ããã³ã°ããªãŒã®äžéšã«ã€ãŸãããŠå¥ã®ãã€ã³ããåãä»ããããšãæåŸ ããŠããã£ãŒã«ãããã¡ãã¡æ©ãåããåã³ã©ã³ãã ã«è¿·è·¯ã®ãã€ã³ããéžæããæ¥ç¶ããããã®ã®1ã€ã«å ¥ããŸã§æ©ãããšã§ãã
Aldous-Broderã«ã¯ãã€ã¢ã¹ããããŸããã 絶察ã«ã ãã®å©ããåããŠåŸãããè¿·è·¯ã¯ãã¹ãŠå®å šã«ã©ã³ãã ã§ããã䌌ãŠããŸããã ã¢ã«ãŽãªãºã ã«ã¯ãæ¹åæ§ããšã³ã¿ã³ã°ã«ã¡ã³ãããŸãã¯ãã®ä»ã®ç¹æ§ã®å¥œã¿ã¯ãããŸããã çµæã®ã©ããªã³ã¹ã¯ã©ã³ãã ã§ãããåæ§ã«çºçããå¯èœæ§ããããŸãã
åé¡ã¯ãä¹±æ°ãžã§ãã¬ãŒã¿ãŒã®æ¬ é¥ã§ããå¯èœæ§ããããŸããä¹±æ°ãžã§ãã¬ãŒã¿ãŒèªäœã¯ãããã€ãã®å€ã«åŒãå¯ããããããé »ç¹ã«å€ãäžããå ŽåããããŸãã ããããããšãã°ãèªç¶ãã€ãºïŒé¢šããŠã©ã³åŽ©å£ïŒã«åºã¥ããã©ã³ãã ãžã§ãã¬ãŒã¿ãŒã䜿çšããå Žåããããããã¢ã«ãŽãªãºã ã®æäœãæçµçã«å®å šã«æ¥œããããšãã§ããŸãã
確ãã«ã圌ã®äœåã芳å¯ããããšã¯ãååšã®ãã¹ãŠã®è ææ§ãšç¡æå³ãã®çã®èªèãäžããŸãã 圌ã¯5Ã5ã®ãã£ãŒã«ãã§30ç§ã«åãŸããããªãã£ããããã¢ãã¡ãŒã·ã§ã³ã§gifãèšé²ããã®ã«å€ãã®æéãè²»ãããŸããã æåŸã®1ã€ã®æªãã§ãã¯ã®ã»ã«ã®ã¿ãã¹ããã³ã°ããªãŒã«æ¥ç¶ãç¶ãããšãAldous-Broderã¯å¥ã®ã³ãŒããŒã«è¡ããããã§åãã©ããããŸããã æçµçã«åœŒã¯è¿·è·¯ã®ãã¹ãŠã®ã»ã«ãåãããšãã§ããããã«ãã¢ãã¡ãŒã·ã§ã³ã®é床ãå€§å¹ ã«äžãããã£ãŒã«ããæžããå¿ èŠããããŸããã
ããã¯ãã¹ããã³ã°ããªãŒã®åçã®å¯èœæ§ã®ããå€çš®ãç 究ãã2人ã®ç¬ç«ããç 究è ã«ãã£ãŠäœæãããŸãããã«ãªãã©ã«ãã¢å€§åŠããŒã¯ã¬ãŒæ ¡ã®ææã§ããDavid AldousãšãçŸåšGoogleã§åããŠããç§åŠè ã®Andrei Broderã§ãã ãããã®ç 究ãã©ã®åéã§åœ¹ç«ã€ããæ確ã«èšãããšã¯å°é£ã§ãã ãã ããã©ããªã³ã¹ã«å ããŠãã¢ã«ãŽãªãºã ã¯æ°åŠçãªç¢ºçã®ç 究ã§ãã°ãã°ãããã¢ããããŸããããã®åäœåçãèãããšé©ãããšã§ã¯ãããŸããã
æ£åŒãªã¢ã«ãŽãªãºã ïŒ
- ã©ã³ãã ãªé ç¹ïŒã»ã«ïŒãéžæããŸãã å®å šã«ã©ã³ãã ã
- ã©ã³ãã ã«é£æ¥ããé ç¹ïŒã»ã«ïŒãéžæããŠãããã«é²ã¿ãŸãã 蚪åãããŠããªãå Žåã¯ãããªãŒã«è¿œå ããŸãïŒåã®ããªãŒã«æ¥ç¶ãããããã®éã®å£ãåé€ããŸãïŒã
- ãã¹ãŠã®ã»ã«ã衚瀺ããããŸã§æé 2ãç¹°ãè¿ããŸãã
äœæ¥äŸ
ãã£ãŒã«ãäžã®çŸåšã®äœçœ®ã¯èµ€ã§åŒ·èª¿è¡šç€ºãããŸãã
å·Šäžé ããå§ããŸãã ããã§ã¯çããããšã¯ãããŸããã
ã©ã³ãã ã«å³ã«ç§»åããŠã2ã€ã®ã»ã«éã®å£ãåé€ããããšã«ããŸããã ããã£ãã
éãæªãã ç§ãã¡ã®RNGã¯ãç§ãã¡ãå·Šã«æ»ããšèšããŸãã
ä»ããŠã³ã éäžã§ãæªèšªåã®ã»ã«ããã¹ãŠæ¥ç¶ãããããã®éã®å£ãåé€ããŸãã
ãŸãã©ãããŒã ããŠã³ïŒ
ããŠã1åã®æ»ãã¯èš±ãããŸãã
å³åŽã«ç§»åããŠå£ãåé€ããããšãéžæããŸãã
ãããŠãããã§ç§ãã¡ã¯2åäžéã§ãããæåã«æ»ããŸãã
éžæè¢ã¯äºåºŠèœã¡ãŠãããŸããããŸããã çŽ æŽããããå°ãªããšãããã€ãã®çš®é¡ã
äžã«è¡ã£ãŠå£ãåãé€ããŸãã
ãããŠã次ã®ã»ã«ã«ç§»åããŸããå£ã¯æ¢ã«åãããªãŒã«ãããããå£ã¯åé€ããŸããã
ç®çããªãæ©ãåããæ©ãåãæã§ãã
ã»ã«2-2ã«æ»ããäžã«éããŠå£ãåãé€ããŸãã
æé€ãå®äºããçæãããè¿·è·¯ãååŸããŸãã
å·Šäžé ããå§ããŸãã ããã§ã¯çããããšã¯ãããŸããã
![](https://habrastorage.org/files/a1a/ac3/20f/a1aac320f9824b96b2af0ec8bc804cfe.png)
ã©ã³ãã ã«å³ã«ç§»åããŠã2ã€ã®ã»ã«éã®å£ãåé€ããããšã«ããŸããã ããã£ãã
![](https://habrastorage.org/files/e2b/91e/0cb/e2b91e0cb28f48cba245c224b68ca9b6.png)
éãæªãã ç§ãã¡ã®RNGã¯ãç§ãã¡ãå·Šã«æ»ããšèšããŸãã
![](https://habrastorage.org/files/ce7/d98/8bf/ce7d988bf95f44c4b875cb039a457ca1.png)
ä»ããŠã³ã éäžã§ãæªèšªåã®ã»ã«ããã¹ãŠæ¥ç¶ãããããã®éã®å£ãåé€ããŸãã
![](https://habrastorage.org/files/a2e/fc2/173/a2efc2173bf54fda8c62a6f74d93e2d6.png)
ãŸãã©ãããŒã ããŠã³ïŒ
![](https://habrastorage.org/files/886/d7e/e2c/886d7ee2c3da4cc4866d421c3013a979.png)
ããŠã1åã®æ»ãã¯èš±ãããŸãã
![](https://habrastorage.org/files/c44/fd5/1ed/c44fd51ed98d41ae9c575587cb616499.png)
å³åŽã«ç§»åããŠå£ãåé€ããããšãéžæããŸãã
![](https://habrastorage.org/files/5e3/04f/738/5e304f7388114a0385be2f12f3b8a804.png)
ãããŠãããã§ç§ãã¡ã¯2åäžéã§ãããæåã«æ»ããŸãã
![](https://habrastorage.org/files/366/646/a0b/366646a0b1e14b17ab1be1cec4591ef1.png)
![](https://habrastorage.org/files/748/9e9/350/7489e9350cae4a57baa4fe49cde97976.png)
éžæè¢ã¯äºåºŠèœã¡ãŠãããŸããããŸããã çŽ æŽããããå°ãªããšãããã€ãã®çš®é¡ã
![](https://habrastorage.org/files/28c/189/5af/28c1895afb1f4ec2a5fb2fc9c3ee1610.png)
![](https://habrastorage.org/files/e5c/d40/beb/e5cd40beb32340a6a2e458efbc5d7ace.png)
äžã«è¡ã£ãŠå£ãåãé€ããŸãã
![](https://habrastorage.org/files/70f/8a2/10c/70f8a210c6864405ac08f50d1bdc8c48.png)
ãããŠã次ã®ã»ã«ã«ç§»åããŸããå£ã¯æ¢ã«åãããªãŒã«ãããããå£ã¯åé€ããŸããã
![](https://habrastorage.org/files/746/a79/2f8/746a792f8bbb45ef8ccfee413d222822.png)
ç®çããªãæ©ãåããæ©ãåãæã§ãã
![](https://habrastorage.org/files/f57/ca6/689/f57ca668915746308daa59fbfd7d48ee.png)
![](https://habrastorage.org/files/ff2/eca/cef/ff2ecacef0e040e496a2f0db7bc55208.png)
![](https://habrastorage.org/files/177/3c7/97e/1773c797ebd14de9afe28e671186e2c7.png)
![](https://habrastorage.org/files/89b/e58/dbe/89be58dbe89f447cadda9f2570176278.png)
ã»ã«2-2ã«æ»ããäžã«éããŠå£ãåãé€ããŸãã
![](https://habrastorage.org/files/0a6/e21/5ce/0a6e215ce75f461eb0cd9533d5c0534a.png)
æé€ãå®äºããçæãããè¿·è·¯ãååŸããŸãã
![](https://habrastorage.org/files/b01/d21/0a4/b01d210a432e4ef791649d70f4d08fc4.png)
é·æïŒ
- ãã€ã¢ã¹ã¯ãããŸããã
- ã©ããªã³ã¹ã¯å®å šã«ã©ã³ãã ã§ããããããããã解決ããããã®ç¹å®ã®ã¢ã«ãŽãªãºã ãäœæããããšã¯ã§ããŸããã
- ãã®äººã®æ±ºå®ã®è€éãã
- ç°¡åãªå®è£ ã
çæïŒ
- ã¹ããŒãã è¿·è·¯ãçæãããéãããªãã¯å¹Žããšã£ãŠæ»ã¬æéãããã§ãããã
- ç¡éã®è¿·è·¯ãçæããããšã¯ã§ããŸããã
- çºé»çµäºæã®å¹çã®å€§å¹ ãªäœäžã
å®è£
local mod = {} local aux = {} aux.width = false aux.height = false aux.sx = false aux.sy = false aux.grid = false aux.dirs = {"UP", "DOWN", "LEFT", "RIGHT"} function aux.createGrid (rows, columns) local MazeGrid = {} for y = 1, rows do MazeGrid[y] = {} for x = 1, columns do MazeGrid[y][x] = {visited = false, bottom_wall = true, right_wall = true} end end return MazeGrid end function mod.createMaze(x1, y1, x2, y2, grid) aux.width, aux.height, aux.sx, aux.sy = x2, y2, x1, y1 aux.grid = grid or aux.createGrid(y2, x2) aux.aldous_broder() return aux.grid end function aux.aldous_broder() local unvisited_cells = aux.width * aux.height local ix = math.random(aux.sx, aux.width) local iy = math.random(aux.sy, aux.height) aux.grid[iy][ix].visited = true unvisited_cells = unvisited_cells - 1 while unvisited_cells ~= 0 do local dir = aux.dirs[math.random(1, 4)] if dir == "UP" then if iy-1 >= aux.sy then if aux.grid[iy-1][ix].visited == false then aux.grid[iy-1][ix].bottom_wall = false aux.grid[iy-1][ix].visited = true unvisited_cells = unvisited_cells - 1 end iy = iy-1 end elseif dir == "DOWN" then if iy+1 <= aux.height then if aux.grid[iy+1][ix].visited == false then aux.grid[iy][ix].bottom_wall = false aux.grid[iy+1][ix].visited = true unvisited_cells = unvisited_cells - 1 end iy = iy+1 end elseif dir == "RIGHT" then if ix+1 <= aux.width then if aux.grid[iy][ix+1].visited == false then aux.grid[iy][ix].right_wall = false aux.grid[iy][ix+1].visited = true unvisited_cells = unvisited_cells - 1 end ix = ix+1 end elseif dir == "LEFT" then if ix-1 >= aux.sx then if aux.grid[iy][ix-1].visited == false then aux.grid[iy][ix-1].right_wall = false aux.grid[iy][ix-1].visited = true unvisited_cells = unvisited_cells - 1 end ix = ix-1 end end end end return mod
ãŠã£ã«ãœã³ã¢ã«ãŽãªãºã
![](https://habrastorage.org/files/fe2/112/aba/fe2112abacea4afda1fac350bfcfd689.png)
![](https://habrastorage.org/files/45f/26f/d10/45f26fd105dd4306a844d8a1146fecd8.png)
![](https://habrastorage.org/files/fc9/db9/9b6/fc9db99b62154bfb995b6489e342caed.gif)
![](https://habrastorage.org/files/198/51d/a13/19851da13b5f42518e8fde188c816df5.gif)
説æ
ããã§ãšããç§ãã¡ã¯ã€ãã«ãã£ãšæ·±å»ãªäœãã«å°éããŸããã ãŠã£ã«ãœã³ã®ã¢ã«ãŽãªãºã ã¯ãå®è£ ãšç解ã®äž¡æ¹ã«ãããŠã以åã®ã¢ã«ãŽãªãºã ãããã¯ããã«è€éã§ãã ãŠã£ã«ãœã³ã®ç®æšã¯ã圌ã®æããªããŒãããŒã§ããAldous-Broderã®ç®æšã®ããã«ãåæ§ã«ç¢ºçã®é«ãã©ã³ãã ãªã¹ããã³ã°ããªãŒãçæããããšã§ãã åäœåçã¯å€å°äŒŒãŠããŸããã詳现ã¯å€§ããç°ãªããŸãã
ãã®ã¢ã«ãŽãªãºã ã¯ãè¿·è·¯ïŒã°ã©ãïŒã®ç§»ååŽã®ã©ã³ãã ãªéžæã«çããåºã¥ããŠããŸããã2ã€ã®éèŠãªéãããããŸãã
ãã£ãŒã«ãå ã移åããŠãã¹ããã³ã°ããªãŒã®é ç¹ãèŠã€ããåã«èšªãããã¹ãŠã®é ç¹ããèšæ¶ãããŸãã æ¢ã«è¿œå ãããé ç¹ã«åºäŒããšããã«ãçæãããããªãŒã«çµæã®ãµãã°ã©ãïŒãã©ã³ãïŒãæ·»ä»ããŸãã ãµãã°ã©ãã«ã«ãŒããäœæãããŠããå Žåã¯ãåé€ããŸãã ã«ãŒããšã¯ãäžæçãªãµãã°ã©ãã«ãã§ã«ããé ç¹ãšãå¥ã®ãã€ã³ãã«ããé ç¹ãšã®æ¥ç¶ãæå³ããŸãã ã€ãŸããé ç¹ã2ã€ãè¶ ããé ç¹ããã£ãŠã¯ãªããŸããã ããªããä»ç解ããŠããªããªããããã¯æããããŸãã-ããªãã¯ä»äºã®äŸã§ããã«æ確ã«èŠãã§ãããã
ãµãã°ã©ããã¹ããã³ã°ããªãŒã«ã¢ã¿ããããåŸã次ã®ã©ã³ãã ãã€ã³ãã®éžæã¯ããŸã ã¢ã¿ãããããŠããªãé ç¹ããã®ã¿çºçããŸãã ãã®çµæãAldous-Broderãšã¯ç°ãªãããŠã£ã«ãœã³ã«ã¯ããã§ã«åŠçãããããŒã¯ãããŠããªãããŸãããšããäžå©ãªç¹ããããŸããã
Aldous-Broderã®ãããªWilsonã®ã¢ã«ãŽãªãºã ã¯ãåãã®ãªãå®å šã«ã©ã³ãã ãªã©ããªã³ã¹ãçæããŸãã ã¢ã«ãŽãªãºã ã«ã¯ãæ¹åæ§ããšã³ã¿ã³ã°ã«ã¡ã³ãããŸãã¯ãã®ä»ã®ç¹æ§ã®å¥œã¿ã¯ãããŸããã æ®å¿µãªãããæè¯ã®çµæãåŸãã«ã¯ãæ°å€ã®èšå®ããªãããŒããŠã§ã¢ä¹±æ°ãžã§ãã¬ãŒã¿ãŒã䜿çšããå¿ èŠããããŸãã
ã¢ã«ãŽãªãºã èªäœã¯ã1996幎ã«ãDavid Wilsonã«ãã£ãŠãç確çã®ã©ã³ãã ã¹ããã³ã°ããªãŒã®çæã«é¢ããè«æã§å ¬éãããŸããã åãšåæ§ã«ãè¿·è·¯ã«å ããŠãæ°åŠç確çã«å°å¿µããããŸããŸãªãµã€ãã«è³æããããã¢ãã衚瀺ãããŸãã ããã«ãç¹ã«åäžã¹ããã³ã°ããªãŒãšãŠã£ã«ãœã³ã¢ã«ãŽãªãºã ã«é¢ããããã€ãã®èå³æ·±ãåºçç©ã«åºäŒããŸããã ãããã®1ã€ã§ã¢ã«ãŽãªãºã èªäœããã詳现ã«èª¬æãããŠããå Žåããã1ã€ã§ã¯å šäœãšããŠæŠå¿µèªäœãšã¹ããã³ã°ããªãŒã®æ°åŠçåºç€ã説æãããŠããŸãã
èªè ãèå³ãæã£ãããããããããŒã2aãæžããŸããããã§ãäœåèªäœãšãã®éšåçãªç¿»èš³ãåŒçšããŸãã ããã§æ°åŠçãªæ£åœåãé¿ããäž»ãªçç±ã¯ãç§ã®èšäºãåå¿è ã也åŒæ°åŠãããããã°ã©ãã³ã°ã«èå³ããã人ã察象ã«ããŠããããã§ãã
æ£åŒãªã¢ã«ãŽãªãºã ïŒ
- ã¹ããã³ã°ããªãŒã«å±ããªãã©ã³ãã ãªé ç¹ãéžæããŠãããªãŒã«è¿œå ããŸãã
- ã¹ããã³ã°ããªãŒã«å±ããªãã©ã³ãã ãªé ç¹ãéžæããããªãŒã«æ¢ã«è¿œå ãããŠããé ç¹ã«å°éãããŸã§ã°ã©ãã®ç§»åïŒè¿·è·¯ïŒãéå§ããŸãã ãµã€ã¯ã«ã圢æãããå Žåããããåé€ããŸãã
- çµæã®ãµãã°ã©ãã®ãã¹ãŠã®é ç¹ãã¹ããã³ã°ããªãŒã«è¿œå ããŸãã
- ãã¹ãŠã®é ç¹ãã¹ããã³ã°ããªãŒã«è¿œå ããããŸã§ãæé 2ã3ãç¹°ãè¿ããŸãã
äœæ¥äŸ
ããªãŒã®æåã®é ç¹ãç·è²ã§åŒ·èª¿è¡šç€ºãããŸãã èµ€-äœæããããã©ã³ãïŒãµãã°ã©ãïŒã
äŒçµ±çã«ãããªãã¯å·Šäžé ã«å ¥ãå¿ èŠããããŸãã 座æš3-2ãããã©ã³ããæ§ç¯ãå§ããŸãã
ãããèå³æ·±ãéèŠãªãã€ã³ãã§ãã ã¢ã«ãŽãªãºã ã¯äžæããããšã決å®ããããã«ãã£ãŠåº§æš2-2ã§ãã©ã³ããéããŸãã
çµæã®ãµã€ã¯ã«ãåé€ãã2-2ããåæ§ç¯ãéå§ããŸãã
habrastorage.org/files/e9c/8e6/46a/e9c8e646af564a42bbb391fbe263044b.png
ããŠãã¢ã«ãŽãªãºã ã¯äžæããããšã決å®ããããã«ãã£ãŠã¡ã€ã³ããªãŒã«åå ããŸããã éäžã§å£ãåãé€ãã次ã®ã»ã«ãéžæããŸãã
åã³ã圌ãã¯æè¿äœæãããæšã«è§Šããå£ãåãé€ããåã³å§ããŸããã
ç§ãã¡ã¯éãããµã€ã¯ã«ãåé€ãã2-3ã§åã³ç¶ããŸããã
æšã«æ¥ç¶ããããã¹ã®å£ãã¯ãªã¢ããŸããã ç§ãã¡ã¯æ°ããã±ãŒãžã§æ ãç¶ããŸããã
åã³ã¡ã€ã³ããªãŒã«æ¥ç¶ããå£ãåãé€ããè¿·è·¯ãå®æãããŸããã
äŒçµ±çã«ãããªãã¯å·Šäžé ã«å ¥ãå¿ èŠããããŸãã 座æš3-2ãããã©ã³ããæ§ç¯ãå§ããŸãã
![](https://habrastorage.org/files/c32/4b8/deb/c324b8deba6f4996ab3866c51bd5841d.png)
![](https://habrastorage.org/files/5aa/6ed/046/5aa6ed046a904094b02e77299de117a6.png)
![](https://habrastorage.org/files/e9c/8e6/46a/e9c8e646af564a42bbb391fbe263044b.png)
![](https://habrastorage.org/files/9d0/aa3/572/9d0aa3572d9d4ebc9483ebe54d7ed78f.png)
ãããèå³æ·±ãéèŠãªãã€ã³ãã§ãã ã¢ã«ãŽãªãºã ã¯äžæããããšã決å®ããããã«ãã£ãŠåº§æš2-2ã§ãã©ã³ããéããŸãã
![](https://habrastorage.org/files/6e2/91e/72f/6e291e72f05d4efd93f4e063d257ab16.png)
çµæã®ãµã€ã¯ã«ãåé€ãã2-2ããåæ§ç¯ãéå§ããŸãã
![](https://habrastorage.org/files/464/2ff/fbf/4642fffbf13a4d0382012f42b4ba3875.png)
habrastorage.org/files/e9c/8e6/46a/e9c8e646af564a42bbb391fbe263044b.png
ããŠãã¢ã«ãŽãªãºã ã¯äžæããããšã決å®ããããã«ãã£ãŠã¡ã€ã³ããªãŒã«åå ããŸããã éäžã§å£ãåãé€ãã次ã®ã»ã«ãéžæããŸãã
![](https://habrastorage.org/files/cd8/bd5/8fb/cd8bd58fbd6846d1aae7ae15c1bf1c09.png)
![](https://habrastorage.org/files/e6d/4ca/3a2/e6d4ca3a24e2461584be977381686509.png)
åã³ã圌ãã¯æè¿äœæãããæšã«è§Šããå£ãåãé€ããåã³å§ããŸããã
![](https://habrastorage.org/files/426/1dc/57b/4261dc57b9084c1dbeb905097579ceb7.png)
![](https://habrastorage.org/files/04e/a12/a6f/04ea12a6f46746faa4813364e4c971b1.png)
![](https://habrastorage.org/files/c63/519/345/c635193455cc466093e603659759686e.png)
![](https://habrastorage.org/files/d9e/76e/1a0/d9e76e1a00c54539bb8899abd02d2e97.png)
ç§ãã¡ã¯éãããµã€ã¯ã«ãåé€ãã2-3ã§åã³ç¶ããŸããã
![](https://habrastorage.org/files/77e/482/644/77e48264497e4585a9b1952193e091c2.png)
æšã«æ¥ç¶ããããã¹ã®å£ãã¯ãªã¢ããŸããã ç§ãã¡ã¯æ°ããã±ãŒãžã§æ ãç¶ããŸããã
![](https://habrastorage.org/files/d47/ea0/f88/d47ea0f88e2844a6b36bd675c6f0c455.png)
![](https://habrastorage.org/files/c6a/96e/39f/c6a96e39f6404038b4b11d3abd0f64d6.png)
![](https://habrastorage.org/files/447/f45/059/447f45059d6c47b1934ed29ae8cd571d.png)
åã³ã¡ã€ã³ããªãŒã«æ¥ç¶ããå£ãåãé€ããè¿·è·¯ãå®æãããŸããã
![](https://habrastorage.org/files/cbb/b04/de6/cbbb04de6f1846159b398eb68c8ead9c.png)
é·æïŒ
- ãã€ã¢ã¹ã¯ãããŸããã
- ã©ããªã³ã¹ã¯å®å šã«ã©ã³ãã ã§ããããããããã解決ããããã®ç¹å®ã®ã¢ã«ãŽãªãºã ãäœæããããšã¯ã§ããŸããã
- ãã®äººã®æ±ºå®ã®è€éãã
- æå³ã®ãªãæŸæµªã¯ãããŸããã
- Oldos-Broderãšæ¯èŒããé床ã¯æ°åã§ãã
çæïŒ
- é£ããå®è£ ã
- çæã®éå§æã«é床ãäœäžããŸãã
- Aldous-Broderããã倧ããªã¡ã¢ãªèŠä»¶ã
å®è£
local mod = {} local aux = {} aux.width = false aux.height = false aux.sx = false aux.sy = false aux.grid = false aux.dirs = {"UP", "DOWN", "LEFT", "RIGHT"} function aux.createGrid (rows, columns) local MazeGrid = {} for y = 1, rows do MazeGrid[y] = {} for x = 1, columns do MazeGrid[y][x] = {visited = false, bottom_wall = true, right_wall = true} end end return MazeGrid end function mod.createMaze(x1, y1, x2, y2, grid) aux.width, aux.height, aux.sx, aux.sy = x2, y2, x1, y1 aux.grid = grid or aux.createGrid(y2, x2) aux.wilson() return aux.grid end function aux.hashKey(x, y) return x * aux.height + (y - 1) end function aux.deHashKey(value) return math.floor(value/aux.height), value%aux.height + 1 end function aux.hashCells(grid) local vtable = {} for yk, yv in pairs(grid) do for xk, xv in pairs(yv) do if xv.visited == false then vtable[aux.hashKey(xk, yk)] = xv end end end return vtable end function aux.wilson() local cellsHash = aux.hashCells(aux.grid) -- , local dirsStack = {} -- local dsHash = {} local dsSize = 0 -- local key, v = next(cellsHash, nil) v.visited = true cellsHash[key] = nil while next(cellsHash) do -- , key = next(cellsHash, nil) -- local start_x, start_y = aux.deHashKey(key) local ix, iy = start_x, start_y while not aux.grid[iy][ix].visited do -- , local dir = aux.dirs[math.random(1, 4)] local isMoved = false key = aux.hashKey(ix, iy) if dir == "UP" and iy-1 >= aux.sy then iy = iy - 1 isMoved = true elseif dir == "DOWN" and iy+1 <= aux.height then iy = iy + 1 isMoved = true elseif dir == "LEFT" and ix-1 >= aux.sx then ix = ix - 1 isMoved = true elseif dir == "RIGHT" and ix+1 <= aux.width then ix = ix + 1 isMoved = true end if isMoved then -- , if dsHash[key] then -- dirsStack[dsHash[key]].dir = dir for i = dsHash[key]+1, dsSize do local x, y = aux.deHashKey(dirsStack[i].hashref) dsHash[dirsStack[i].hashref] = nil dirsStack[i] = nil dsSize = dsSize - 1 end else local x, y = aux.deHashKey(key) -- dsSize = dsSize + 1 dsHash[key] = dsSize dirsStack[dsSize] = {dir = dir, hashref = key} end end end for i = 1, dsSize do -- aux.grid[start_y][start_x].visited = true cellsHash[aux.hashKey(start_x, start_y)] = nil aux.grid[start_y][start_x].point = false local dir = dirsStack[i].dir if dir == "UP" then aux.grid[start_y-1][start_x].bottom_wall = false start_y = start_y - 1 elseif dir == "DOWN" then aux.grid[start_y][start_x].bottom_wall = false start_y = start_y + 1 elseif dir == "LEFT" then aux.grid[start_y][start_x-1].right_wall = false start_x = start_x - 1 elseif dir == "RIGHT" then aux.grid[start_y][start_x].right_wall = false start_x = start_x + 1 end end dsHash, dirsStack, dsSize = {}, {}, 0 -- end end return mod
ãšãããŒã°ïŒ
äžèšã®ãã¹ãŠãèŠçŽãããšãããè€éãªã¢ã«ãŽãªãºã ã«çæããã°ã©ãã®ããã€ãã®ïŒããã€ãã®ïŒæŠå¿µãèŠã€ããããäž»ãªå°é£ã¯ãŸã æ¥ãŠããªãããšã«æ³šæãã䟡å€ããããŸãã EllerãKraskalãPrimã®æããã«çŽããããã¢ã«ãŽãªãºã ã¯ãã°ã©ããšããªãŒã®æäœã®ã¿ã«åºã¥ããŠãããèå³æ·±ããšã¯ãããé£ããåºçç©ãæºåããŠããŸãã ãã ããããããæžãå§ããåã«ããªã¿ãŒã³ãµãŒãã¢ã«ãŽãªãºã ãšããCatchïŒKillããšåŒã°ãããã®ãèŠãŠãã ãããè¿·è·¯ãçæããäœæ¥ã¯ä»ã®ãã¹ãŠãšã¯éåžžã«ç°ãªããŸãã 次ã®èšäºã«ã€ããŠãã³ããäžããŸããã
ä»ã«äœã åã®éšåãžã®ã³ã¡ã³ãã§ãäžéšã®äººã ã¯åœŒãã®çæã¢ã«ãŽãªãºã ãå°ãããæšãŠããããŸããã ç¬èªã®æ¹æ³ã§ã©ããªã³ã¹ã®äœæãäžåºŠå®è£ ããä»ããèŠããããšãã§ããå Žåã¯ãå ±æããŠãã ããã ãããããããªãã®èš±å¯ãåŸãŠãç§ã圌ã«ã€ããŠæžãèšäºã®ããã€ãã§ã äžè¬çã«ãç§ã¯ãã®ãããã¯ã«é¢ããèå³æ·±ã話ãæãåºã«æºè¶³ããŠããŸãã åŠæ ¡ã®ããŒãããã¯ã倧åŠã®ã³ã³ãã¥ãŒã¿ãŒã§è¿·è·¯ãæãæ¹æ³ãèŠããŠããŠãæ§ããŸããã
ãŸãããããŠãã€ãã®ããã«ã é¡ããæ¹å€ãã³ã¡ã³ãã¯ãã€ã§ãæè¿ããŸãããããã¯ãæ°ã«å ¥ã£ãŠæ¬¡ã®ããŒããèŠããå Žåã¯ãã³ã¡ã³ãã«æžããŠãã ããã
Lua +ã®ã¢ã«ãŽãªãºã ã®ãœãŒã¹+ Love2Dã§ã¬ã³ããªã³ã°ïŒã³ã¡ã³ãå ã®ãªã¯ãšã¹ãã§ã³ãŒããã¬ã€ã¢ãŠããããŸãããªãã¡ã¯ã¿ãªã³ã°ãããŸããïŒïŒ
Github