バッチファイル(けい線迷路3_ランダムで100個作成)

■4×4のランダムで100個作成。
前回からマスが通じているかプログラム的にできないか考えてみたけど、なかなか難しいそうだった。単純に、長方形のような形で囲まれている状態もあれば、長方形のような形をとらないものもある。

前回、考えた外周以外のルートはその通りだと思うけど、プログラム実装が思いつかなかった。単純にNGとなるパターンを挙げていってif文ではじくようにすることはできるかもしれないけど、ロジック的なものが思いつかない。

100個ランダムで作成したものを見て、このトピックは終わりにする。
ランダムで100作ったのが下のもの。(多分、重複しているものはないと思う)

この中で通じていないマスがあるものは55個あった。

また、下のようにループできるようにマスが通じているものは41個ある。こういったものもスカスカすぎて迷路としては使えない。

マスが通じていない、又は通じすぎているものをはじくようなプログラムを考えたかったけど断念。

最終的なバッチファイルが下のもの。

@echo off

set MAX=3
set /a trial=0
set /a num=0

setlocal enabledelayedexpansion
:start
for /l %%n in (0,1,%MAX%) do (
  for /l %%m in (0,1,%MAX%) do (
if %%n==0 (
   if %%m==0 (
      set mageMap[%%n][%%m]=┌
   ) else if %%m lss %MAX% (    
      set /a randnum=!random!*2/32767 
      if !randnum!==0 (
         set mageMap[%%n][%%m]=―
      ) else if !randnum!==1 (
         set mageMap[%%n][%%m]=┬
      )
   ) else (
      set mageMap[%%n][%%m]=┐
   )
) else if %%n lss %MAX% (
   if %%m==0 (
       set /a randnum=!random!*2/32767 
       if !randnum!==0 (
          set mageMap[%%n][%%m]=|
       ) else if !randnum!==1 (
          set mageMap[%%n][%%m]=├
       )
   ) else if %%m lss %MAX% (    
       set /a randnum=!random!*12/32767 
       if !randnum!==0 (
          set mageMap[%%n][%%m]=┌
       ) else if !randnum!==1 (
          set mageMap[%%n][%%m]=┬
       ) else if !randnum!==2 (
          set mageMap[%%n][%%m]=┐
       ) else if !randnum!==3 (
          set mageMap[%%n][%%m]=├
       ) else if !randnum!==4 (
          set mageMap[%%n][%%m]=┼
       ) else if !randnum!==5 (
          set mageMap[%%n][%%m]=┤
       ) else if !randnum!==6 (
          set mageMap[%%n][%%m]=└
       ) else if !randnum!==7 (
          set mageMap[%%n][%%m]=┴
       ) else if !randnum!==8 (
          set mageMap[%%n][%%m]=┘
       ) else if !randnum!==9 (
          set mageMap[%%n][%%m]=┤
       ) else if !randnum!==10 (
          set mageMap[%%n][%%m]=―
       ) else if !randnum!==11 (
          set mageMap[%%n][%%m]=|
       ) else if !randnum!==12 (
          set mageMap[%%n][%%m]= 
       )
   ) else (
       set /a randnum=!random!*2/32767 
       if !randnum!==0 (
          set mageMap[%%n][%%m]=|
       ) else if !randnum!==1 (
          set mageMap[%%n][%%m]=┤
       )
   )
) else (
   if %%m==0 (
    set mageMap[%%n][%%m]=└
   ) else if %%m lss %MAX% (
       set /a randnum=!random!*2/32767 
       if !randnum!==0 (
          set mageMap[%%n][%%m]=┴
       ) else if !randnum!==1 (
          set mageMap[%%n][%%m]=―
       )
   ) else (
    set mageMap[%%n][%%m]=┘
   )
   )
)
)

for /l %%n in (0,1,%MAX%) do (
    echo !mageMap[%%n][0]!!mageMap[%%n][1]!!mageMap[%%n][2]!!mageMap[%%n][3]!
)

set /a checkCount=0
for /l %%n in (0,1,!num!) do (
   if !result[%%n]!=="!mageMap[0][0]!,!mageMap[0][1]!,!mageMap[0][2]!,!mageMap[0][3]!,!mageMap[1][0]!,!mageMap[1][1]!,!mageMap[1][2]!,!mageMap[1][3]!,!mageMap[2][0]!,!mageMap[2][1]!,!mageMap[2][2]!,!mageMap[2][3]!,!mageMap[3][0]!,!mageMap[3][1]!,!mageMap[3][2]!,!mageMap[3][3]!" (
   rem no record
   pause 
   ) else (
   set /a checkCount=!checkCount!+1
   )
)

set /a checkCount=!checkCount!-1

if !checkCount!==!num! (
   set /a num=!num!+1
   set result[%num%]="!mageMap[0][0]!,!mageMap[0][1]!,!mageMap[0][2]!,!mageMap[0][3]!,!mageMap[1][0]!,!mageMap[1][1]!,!mageMap[1][2]!,!mageMap[1][3]!,!mageMap[2][0]!,!mageMap[2][1]!,!mageMap[2][2]!,!mageMap[2][3]!,!mageMap[3][0]!,!mageMap[3][1]!,!mageMap[3][2]!,!mageMap[3][3]!"
) else (
   pause 
)


if %trial% gtr 100 (
  goto:end 
) else (
set /a trial=trial+1
)

goto:start
:end