| @echo off&setlocal enabledelayedexpansion |
| set>$ |
| (for /f "delims==" %%a in ($) do set %%a= |
| path %path%) |
| |
| :::::::::::清洁变量环境,提升脚本效率::::::::::::: |
| |
| rem -----------------一、自适应判断------------------- |
| |
| (set /p .1= |
| set "$=!.1!#" |
| for %%a in (32 16 8 4 2 1) do ( |
| if !$:~%%a^,1!. NEQ . set /a mx+=%%a&set $=!$:~%%a! |
| ) |
| |
| |
| for /f %%a in (迷宫.txt) do set /a my+=1 |
| |
| |
| for /l %%a in (2 1 !my!) do ( |
| set /p .%%a= |
| |
| set /a #!.%%a:~,1!+=1,#!.%%a:~-1!+=1 |
| |
| ) |
| |
| for %%z in (!my!) do for /l %%a in (2 1 !mx!) do ( |
| set /a #!.1:~%%a,1!+=1,#!.%%z:~%%a,1!+=1 |
| |
| ) |
| |
| )<迷宫.txt |
| |
| set /a xx=mx*2+1,yy=my+3 |
| mode con:lines=%yy% cols=%xx% |
| echo %time% |
| |
| |
| set #>$ |
| for /f "tokens=1,2 delims=#=" %%a in ($) do ( |
| set #%%a= |
| if %%b==2 set 路=%%a |
| ) |
| |
| ::::::::::::::::::收集基本信息:::::::::::::::::::: |
| |
| set /a nx=mx-1,all=mx*my |
| ::nx 为宽度减一,用于后面的偏移,all 为寻路时的总迭代上限 |
| set "use= " |
| for /l %%a in (0 1 %nx%) do ( |
| if defined .%%a ( |
| for /l %%b in (0 1 %nx%) do ( |
| if "!.%%a:~%%b,1!"=="%路%" set use= %%b.%%a!use! |
| |
| ) |
| if "!.%%a:~,1!"=="%路%" ( |
| set se=!se! 0-%%a |
| set t=!t!2 |
| ) |
| if "!.%%a:~-1!"=="%路%" ( |
| set se=!se! %nx%-%%a |
| set t=!t!1 |
| ) |
| ) |
| if "!.1:~%%a,1!"=="%路%" ( |
| set se=!se! %%a-1 |
| set t=!t!4 |
| ) |
| if "!.%my%:~%%a,1!"=="%路%" ( |
| set se=!se! %%a-%my% |
| set t=!t!3 |
| ) |
| |
| ) |
| :::::::::::::::::::进一步分析::::::::::::::::::::: |
| |
| rem --------------------二、优化---------------------- |
| |
| for %%a in (!se!) do if defined start (set end=%%a) else set start=%%a |
| ::设置 se 变量中的第一个坐标为起点,第二个坐标为终点 |
| for /f "tokens=1-4 delims=-" %%a in ("%start%-%end%") do ( |
| set /a fx=%%a-%%c,fy=%%d-%%b |
| if !fx:-^=! gtr !fy:-^=! ( |
| set f= 2 3 4 1 |
| ) else set f= 3 2 1 4 |
| if !fx! lss 0 ( |
| set f=!f: 1= @! |
| set f=!f: 3= 1! |
| set f=!f: @= 3! |
| ) |
| if !fy! lss 0 ( |
| set f=!f: 2= @! |
| set f=!f: 4= 2! |
| set f=!f: @= 4! |
| ) |
| |
| set /a "fs=1+%%a/%nx%*2+^!~-%%b+(%%b/%my%)*3"" |
| set /a "fe=1+2*^!%%c+3*^!~-%%d+%%d/%my%" |
| |
| ) |
| set "ff=@→↓←↑" |
| ::设置出入口的方向标志 |
| set try="%start:-= %" |
| set "t=%t:~,1% " |
| ::try 保存路线坐标,t 记录要排除的方向 |
| ::::::::::::::::规划主要探测方向:::::::::::::::::: |
| |
| for %%a in ($ fx fy se) do set %%a= |
| ::::::::::::::::再次清空多余变量:::::::::::::::::: |
| |
| rem --------------------三、计算---------------------- |
| |
| for /l %%a in (1 1 %all%) do ( |
| for /f tokens^=1-3delims^=^,^"^ %%b in ("!t:~,2!!try!") do ( |
| |
| for %%e in (!f:%%b^=!) do ( |
| |
| if defined back ( |
| set /a "cx=%%c+(2*(%%e/3)-1)*^!(%%e%%2)","cy=%%d+(2*(%%e/3)-1)*(%%e%%2)","no=(%%e+2)%%5+%%e/3" |
| |
| for /f "tokens=1,2" %%x in ("!cx! !cy!") do ( |
| if "!use: %%x.%%y =!" neq "!use!" ( |
| |
| if "!try:"%%x^ %%y"=!"=="!try!" ( |
| |
| set back= |
| if !cx!-!cy!==%start% echo 无答案&pause&exit |
| if !cx!-!cy!==%end% call :end |
| |
| set try="!cx! !cy!",!try! |
| set "t=!no! !t!" |
| |
| ) else set use=!use: %%x.%%y = ! |
| |
| ) |
| ) |
| ) |
| |
| ) |
| if defined back ( |
| set use=!use: %%c.%%d = ! |
| set t=!t:~2! |
| set try=!try:*,=! |
| ) else set back=1 |
| |
| ) |
| ) |
| |
| rem --------------------四、输出---------------------- |
| |
| :end |
| set f=!f:~-2!!f:~-4,2! |
| for %%a in (!t!) do ( |
| for /f tokens^=1-2delims^=^,^"^ %%b in ("!try!") do ( |
| for %%d in (!f:%%a^=!) do ( |
| |
| set /a "cx=%%b+(2*(%%d%%2)-1)*^!(%%d/3)","cy=%%c+(2*(%%d%%2)-1)*(%%d/3)","no=%%d+2*(%%d%%2)-1" |
| for /f "tokens=1,2" %%x in ("!cx! !cy!") do ( |
| set try=!try:*"%%x %%y",="%%b %%c","%%x %%y",! |
| |
| set new=!new!"%%b %%c", |
| |
| ) |
| |
| ) |
| set try=!try:*,=! |
| ) |
| ) |
| |
| for /f "tokens=1,2 delims=-" %%a in ("%end%") do set /a lx=%%a-1,ly=%%b |
| |
| for %%a in ("%end:-= %" !new!) do ( |
| if "!lx! !ly!" neq %%a for /f "tokens=1,2" %%b in ("%%~a") do ( |
| set /a "n=%%b+1,fe=1+((%%b-lx+1&2)+(ly-%%c+2^2)),lx=%%b,ly=%%c" |
| if %%b-%%c==%end% set fe=%fe% |
| |
| for /f "tokens=1,2" %%e in ("!n! !fe!") do ( |
| set .%%c=!.%%c:~,%%b!!ff:~%%f,1!!.%%c:~%%e! |
| ) |
| |
| ) |
| ) |
| |
| ::转换结果为可见图形 |
| for /l %%d in (1 1 %my%) do echo !.%%d! |
| ::打印结果 |
| echo %time% |
| (del $ &pause&exit)>nul |
| ::::::::::::::将结果转换为可见图形::::::::::::::::COPY |