バッチファイル(けい線迷路2_マスが通じているか検討)

■すべてのマスが通じているかの確認方法の検討
迷路として使えそうな組み合わせを取り出すために、すべての組み合わせからNGとなる組み合わせを除く形で考えていく。下のようなものは右下のマスに行けないのでNG。

1マスの四方が線になっている状態以外にも下のような形のNGもある。

こう見ていくと、外周以外に1周回ることができるルートがある場合はNGとなりそう。つまり、例えば左下から出発して同じ頂点に戻ろうとする場合、外周以外では途中で途切れて戻れないものを探せばいい。

そこで、頂点の座標とけい線の枝部分を定義して、外周以外に1周回ることができるルートがあるかを確認してみる。けい線の1辺は基本的に全角の半分なので0.5として定義し、下のようにleft (l), right (r), upper (u), down (d)として数値をもたせる。

2次配列にけい線を入れるようなバッチを組んで下準備した。これで作成される組み合わせに対して検証する。

@echo off

setlocal enabledelayedexpansion
for /l %%n in (0,1,3) do (
  for /l %%m in (0,1,3) do (
if %%n==0 (
   if %%m==0 (
      set mageMap[%%n][%%m]=┌
   ) else if %%m lss 3 (    
      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 3 (
   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 3 (    
       set /a randnum=!random!*11/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 (
       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 3 (
       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,3) do (
    echo !mageMap[%%n][0]!!mageMap[%%n][1]!!mageMap[%%n][2]!!mageMap[%%n][3]!
)