Board logo

标题: [练习]批处理解决小明搭积木 [打印本页]

作者: Seter    时间: 2009-10-8 10:23     标题: [练习]批处理解决小明搭积木

Eeee...原谅我起的这个俗名字...
小明很喜欢搭积木,但他很懒惰,想在开始搭积木前先知道搭出来的积木会是怎么样的
每块积木的大小是1*1*1(见链接: https://pan.baidu.com/s/1Dz6vu3SpIKZYbJ86XSCZ_A?pwd=fr6c)

code中居然自动省略了空格...看起来效果不好,请下载到本地查看



小明将搭在一个矩形的方块内(第一行,第一列,最后一行,最后一列不可能没有积木),他将每个区域要搭的积木数写入in.txt中
  1. (in.txt)
  2. 1 2
  3. 2 1
复制代码
他希望执行ex.bat后得到out.txt(见链接: https://pan.baidu.com/s/1zsQxs6ZSgxNwtijtQS68Rw?pwd=jitd)
注意:这个例子并不是很好,因为第一列有一块积木恰好被挡住了,但是有时积木并不会被挡住,比如第二列

[挑战下大家的图形意识和批处理的图形意识^__^]
作者: wxcute    时间: 2009-10-8 21:49

我想应该有个坐标说明
  1. (Y向上)
  2. | /(Z向后)
  3. . .
  4. |/
  5. .---.---(X向右)
复制代码

in.txt 是从后到前表示数目,不知道是不是这样。
作者: Seter    时间: 2009-10-9 19:22

呃...我发现我的题目果然没出好
in.txt是ZX轴上的,数字为几就在该区域内向上(Y轴)叠几个积木
作者: flyinspace    时间: 2009-10-11 14:17

图形已经绘制完成...

只是...需要精简代码。..

先放上绘制图形的截图
下面的数据是这个批处理绘制的图形
  1. 1 3 5 3 5 3 3 3 3 5
  2. 1 3 5 3 5 2 3 3 3 5
  3. 1 3 5 3 5 3 3 3 3 5
  4. 3 1 3 3 5 3 2 2 2 5
复制代码

作者: flyinspace    时间: 2009-10-11 15:27

这个....楼下太牛了..

我的代码3倍于他....

编辑掉..

[ 本帖最后由 flyinspace 于 2009-10-11 23:55 编辑 ]
作者: netbenton    时间: 2009-10-11 18:11

立方体定义到变量“v"了

图型则读取文件 in.txt,定义格式按楼主的方式
  1. @echo off&setlocal enabledelayedexpansion
  2. set "v=@@*---*@/   /|*---* *|   |/@*---*@@"
  3. set cr=^
  4. set/a ns=0,ms=0
  5. for /f "tokens=*" %%a in (in.txt) do (
  6. set/a na=n,ma=m
  7. for %%b in (%%a) do (
  8. set/a m+=4,n=na
  9. for /l %%c in (1,1,%%b) do (
  10. if !n! gtr !ng! set/a ng=n
  11. if !m! gtr !mg! set/a mg=m
  12. if !n! lss !ns! set/a ns=n
  13. if !m! lss !ms! set/a ms=m
  14. call :sub
  15. set/a n-=2
  16. )
  17. )
  18. set/a m=ma,n=na,n+=2,m-=2
  19. )
  20. pause
  21. goto :eof
  22. :cho
  23. set /a ngg=ng+5,mgg=mg+7
  24. set str=
  25. for /l %%a in (!ns!,1,!ngg!) do (
  26. for /l %%b in (!ms!,1,!mgg!) do (
  27. set "var=!_%%a.%%b! "
  28. set str=!str!!var:~,1!
  29. )
  30. set str=!str!!cr!
  31. )
  32. cls&echo;!str!
  33. ping -n 1 127.1 >nul
  34. goto :eof
  35. :sub
  36. for /l %%a in (0,1,34) do (
  37. set "o=!v:~%%a,1!"
  38. if defined o if "!o!" neq "@" (
  39. set/a "nx=%%a/7+n,my=%%a%%7+m"
  40. set _!nx!.!my!=!o!
  41. )
  42. )
  43. call :cho
  44. goto :eof
复制代码

作者: netbenton    时间: 2009-10-11 18:51

增加了读取ex.txt文件立方体数据到变量“v"
  1. @echo off&setlocal enabledelayedexpansion&set cr=^
  2. set h=0123456789abcdef
  3. ::读取ex.txt文件立方体到变量“v"
  4. for /f "delims=" %%a in (ex.txt) do (
  5. set "str=@%%a@@@@@@@@@@@@@@@@"
  6. for /l %%b in (1,1,10) do (set str=!str: @=@@!&set str=!str:@ =@@!)
  7. set s=!h!%%a
  8. set/a s=0x!s:~-16,1!,x+=1
  9. if !s! gtr !yg! set/a yg=s
  10. set _!x!=!str!
  11. )
  12. set v=
  13. for /l %%a in (1,1,!x!) do (
  14. set v=!v!!_%%a:~1,%yg%!
  15. )
  16. set/a xy=x*yg-1
  17. ::根据in.txt数据,画立方图形,写到二维数组空间_n.m
  18. set/a ns=0,ms=0
  19. for /f "tokens=*" %%a in (in.txt) do (
  20. set/a na=n,ma=m
  21. for %%b in (%%a) do (
  22.   set/a m+=4,n=na
  23.   for /l %%c in (1,1,%%b) do (
  24.   if !n! gtr !ng! set/a ng=n
  25.   if !m! gtr !mg! set/a mg=m
  26.   if !n! lss !ns! set/a ns=n
  27.   if !m! lss !ms! set/a ms=m
  28.    call :sub
  29.    set/a n-=2
  30.   )
  31. )
  32. set/a m=ma,n=na,n+=2,m-=2
  33. )
  34. pause
  35. goto :eof
  36. :cho 把二维空间的数据显示出来
  37. set /a ngg=ng+5,mgg=mg+7
  38. set str=
  39. for /l %%a in (!ns!,1,!ngg!) do (
  40. for /l %%b in (!ms!,1,!mgg!) do (
  41.   set "var=!_%%a.%%b! "
  42.   set str=!str!!var:~,1!
  43. )
  44. set str=!str!!cr!
  45. )
  46. cls&echo;!str!
  47. ping -n 1 127.1 >nul
  48. goto :eof
  49. :sub 把一个立方图形放到地址空间
  50. for /l %%a in (0,1,!xy!) do (
  51. set "o=!v:~%%a,1!"
  52. if defined o if "!o!" neq "@" (
  53.   set/a "nx=%%a/7+n,my=%%a%%7+m"
  54.   set _!nx!.!my!=!o!
  55. )  
  56. )
  57. call :cho
  58. goto :eof
复制代码

[ 本帖最后由 netbenton 于 2009-10-11 18:54 编辑 ]
作者: netbenton    时间: 2009-10-12 13:03

小提速。。。
  1. @echo off&setlocal enabledelayedexpansion&set cr=^
  2. set h=0123456789abcdef
  3. set tt=!time!
  4. ::读取ex.txt文件立方体到变量“v"
  5. for /f "delims=" %%a in (ex.txt) do (
  6.         set s=!h!%%a
  7.         set/a s=0x!s:~-17,1!,x+=1
  8.         set str=%%a
  9.         set y=
  10.         for /l %%b in (0,1,!s!) do (
  11.                 if "!str:~%%b,1!" neq " " set y=y
  12.                 if defined y set v=!v! "!x!$%%b$!str:~%%b,1!"
  13.         )
  14. )
  15. ::根据in.txt数据,画立方图形,写到二维数组空间_n.m
  16. set/a ns=0,ms=0
  17. for /f "tokens=*" %%a in (in.txt) do (
  18.         set/a na=n,ma=m
  19.         for %%b in (%%a) do (
  20.                 set/a m+=4,n=na
  21.                 for /l %%c in (1,1,%%b) do (
  22.                 rem \\\根据实际大小来定义显示边界\\
  23.                 if !n! gtr !ng! set/a ng=n
  24.                 if !m! gtr !mg! set/a mg=m
  25.                 if !n! lss !ns! set/a ns=n
  26.                 if !m! lss !ms! set/a ms=m
  27.                 rem \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
  28.                
  29.                 rem 把一个立方图形放到地址空间
  30.                 for %%g in (%v%) do (
  31.                         for /f "tokens=1-3 delims=$" %%l in (%%g) do (
  32.                                 set/a "nx=%%l+n,my=%%m+m"
  33.                                 set _!nx!.!my!=%%n
  34.                         )               
  35.                 )
  36.                 rem \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
  37.                         call :ech
  38.                
  39.                         set/a n-=2
  40.                 )
  41.         )
  42.         set/a m=ma,n=na,n+=2,m-=2
  43. )
  44. echo !tt! %time%
  45. pause
  46. goto :eof
  47. rem 把二维空间的数据显示出来
  48. :ech
  49. set /a ngg=ng+5,mgg=mg+7
  50. set str=
  51. for /l %%a in (!ns!,1,!ngg!) do (
  52.         for /l %%b in (!ms!,1,!mgg!) do (
  53.                 set "var=!_%%a.%%b! "
  54.                 set str=!str!!var:~,1!
  55.         )
  56.         set str=!str!!cr!
  57. )
  58. cls&echo;!str!
  59. goto :eof
  60. rem \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
复制代码

作者: Seter    时间: 2009-10-12 19:37

打错字 =___= 是熟练程度~
作者: sl543001    时间: 2009-11-17 14:21

很好很强大值得学习,
顺便对比研究提速过程!
作者: gbw911    时间: 2009-11-29 10:41

很好,对那些不常用到的能加一些说明就好了
作者: garyng    时间: 2011-8-22 14:20

作图的时候超帅的!!
作者: qc5111    时间: 2011-8-23 01:59

建议你们用自定义字符,魔塔2就是这样的,正准备研发2帧动画
作者: lmedwuzr    时间: 2012-7-19 20:01

非常酷哦,不顶对不起良心












宣传片制作www.shijibafang.com
作者: nhygvfr    时间: 2013-1-26 09:32

一个小问题:八楼netbenton写的批处理
如果把@echo off&******下面的两个自然段去掉,会有问题




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2