バッチファイルでProject Euler(44)

Problem 18


この問題も、

call :set_v v 19 01 23 75 03 34

というように配列を初期化します。
この問題はメモ化を使えば速いのですが、ここでは全探索することが求められています。全探索は再帰を使えば簡単に可能です。

@echo off

setlocal
set /a v.size = 0
call :set_v v 75
call :set_v v 95 64
call :set_v v 17 47 82
call :set_v v 18 35 87 10
call :set_v v 20 04 82 47 65
call :set_v v 19 01 23 75 03 34
call :set_v v 88 02 77 73 07 63 67
call :set_v v 99 65 04 28 06 16 70 92
call :set_v v 41 41 26 56 83 40 80 70 33
call :set_v v 41 48 72 33 47 32 37 16 94 29
call :set_v v 53 71 44 65 25 43 91 52 97 51 14
call :set_v v 70 11 33 28 77 73 17 78 39 68 17 57
call :set_v v 91 71 52 38 17 14 91 43 58 50 27 29 48
call :set_v v 63 66 04 68 89 53 67 30 73 16 69 87 40 31
call :set_v v 04 62 98 27 23 09 70 98 73 93 38 53 60 04 23

call :max_sum 0 0
echo %ERRORLEVEL%
exit /b 0

:max_sum
    setlocal
    if %2 == %v.size% exit /b 0
    
    set /a y = %2 + 1
    set /a x1 = %1
    call :max_sum %x1% %y%
    set /a m1 = %ERRORLEVEL%
    set /a x2 = %1 + 1
    call :max_sum %x2% %y%
    set /a m2 = %ERRORLEVEL%
    if %m1% GTR %m2% (
        set /a m = %m1% + "v_%2_%1"
    ) else (
        set /a m = %m2% + "v_%2_%1"
    )
    exit /b %m%

:max_path
    setlocal
    set /a x = %1
    set /a y = %2
    if %y% == %v.size% - 1
    call :max_path 

:set_v
    set /a size = "%1.size"
    set /a %1.size += 1
    :loop_set_v
        if "%2" == "" exit /b 0
        set /a a = 1%2 %% 100
        call :push_vector %1_%size% %a%
        shift /2
        goto :loop_set_v
    exit /b 0

:push_vector
    set /a _size = "%1.size"
    set %1_%_size%=%2
    set /a %1.size += 1
    exit /b 0