找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 16765|回复: 6

批处理 输出方框

[复制链接]
发表于 2012-5-22 18:32:20 | 显示全部楼层 |阅读模式
本帖最后由 plp626 于 2012-5-22 18:36 编辑

网上找来的一个练习题, 有些人的代码走了弯路,发来看看大家的结果;
  1. -->test 1
  2. x

  3. -->test 2
  4. x x x
  5. x y x
  6. x x x

  7. -->test 3
  8. x x x x x
  9. x y y y x
  10. x y z y x
  11. x y y y x
  12. x x x x x

  13. -->test 4
  14. x x x x x x x
  15. x y y y y y x
  16. x y z z z y x
  17. x y z 1 z y x
  18. x y z z z y x
  19. x y y y y y x
  20. x x x x x x x

  21. -->test 5
  22. x x x x x x x x x
  23. x y y y y y y y x
  24. x y z z z z z y x
  25. x y z 0 0 0 z y x
  26. x y z 0 1 0 z y x
  27. x y z 0 0 0 z y x
  28. x y z z z z z y x
  29. x y y y y y y y x
  30. x x x x x x x x x

  31. -->test 6
  32. x x x x x x x x x x x
  33. x y y y y y y y y y x
  34. x y z z z z z z z y x
  35. x y z 0 0 0 0 0 z y x
  36. x y z 0 0 0 0 0 z y x
  37. x y z 0 0 1 0 0 z y x
  38. x y z 0 0 0 0 0 z y x
  39. x y z 0 0 0 0 0 z y x
  40. x y z z z z z z z y x
  41. x y y y y y y y y y x
  42. x x x x x x x x x x x

  43. -->test 7
  44. x x x x x x x x x x x x x
  45. x y y y y y y y y y y y x
  46. x y z z z z z z z z z y x
  47. x y z 0 0 0 0 0 0 0 z y x
  48. x y z 0 0 0 0 0 0 0 z y x
  49. x y z 0 0 0 0 0 0 0 z y x
  50. x y z 0 0 0 1 0 0 0 z y x
  51. x y z 0 0 0 0 0 0 0 z y x
  52. x y z 0 0 0 0 0 0 0 z y x
  53. x y z 0 0 0 0 0 0 0 z y x
  54. x y z z z z z z z z z y x
  55. x y y y y y y y y y y y x
  56. x x x x x x x x x x x x x
复制代码
规律就是如此(test后面的参数 小于100),请编写一个批处理程序,实现以上输出
发表于 2012-5-22 18:40:19 | 显示全部楼层
set /a 一族表示无压力
^_^
 楼主| 发表于 2012-5-22 18:41:57 | 显示全部楼层
不准骄傲, 赛代码。。。
发表于 2012-5-22 21:03:36 | 显示全部楼层
本帖最后由 neorobin 于 2012-6-2 11:27 编辑

想到 3 种思路:
外扩, 内填, 拟出规则直接生成
其实是若干个同心 " 圆 ",  根据与 圆心 的距离, 可以很简单的确定 字符
发表于 2012-5-22 22:56:33 | 显示全部楼层
抢先发一个同心圆算法的
  1. @echo off & setlocal enabledelayedexpansion
  2. set "CS=zyx"
  3. for /l %%p in (1 1 99) do (
  4.   set /a "rMax=%%p-1"
  5.   for /l %%l in (-!rMax! 1 !rMax!) do (
  6.     set "L="
  7.     set /a "a=%%l, t=a>>31, a=(a+t)^t"
  8.     for /l %%c in (-!rMax! 1 !rMax!) do (
  9.       set /a "b=%%c, t=b>>31, b=(b+t)^t"
  10.       set /a "t=(a-b)>>31, r=(t&b)|(~t&a), rd=r-rMax-1"

  11.       if !r!==0 (
  12.         if !rMax! geq 3 (set "L=!L!1") else set "L=!L!!CS:~-%%p,1!"
  13.       ) else (
  14.         if !rd! lss -3 (
  15.           set "L=!L!0"
  16.         ) else for %%i in (!rd!) do set "L=!L!!CS:~%%i,1!"
  17.       )
  18.     )
  19.     echo,!L!
  20.   )
  21.   pause & cls
  22. )
复制代码

评分

参与人数 1技术 +1 收起 理由
plp626 + 1 不错。。。

查看全部评分

发表于 2012-5-23 00:30:26 | 显示全部楼层
本帖最后由 neorobin 于 2012-6-2 11:26 编辑

将 半径 大于或等于 4 时, 调整为 高效算法
  1. @echo off & setlocal enabledelayedexpansion
  2. if "%1"=="" (
  3.   for %%a in (  FontSize:00080008
  4.                 FontFamily:00000030
  5.                 WindowSize:00c700c7
  6.                 ScreenColors:0000000f
  7.                 CodePage:000001b5
  8.                 ScreenBufferSize:00c700c7
  9.   ) do for /f "tokens=1,2 delims=:" %%b in ("%%a") do (
  10.     >nul reg add HKCU\Console\CharBox /v %%b /t reg_dword /d 0x%%c /f
  11.   )
  12.   start "CharBox" /max "%ComSpec%" /c "%~f0" 1&goto:eof
  13. ) else ( >nul reg delete HKCU\Console\CharBox /f )


  14. set "CS=zyx" & set "CSR=xyz"
  15. for /l %%p in (1 1 200) do set "_0=0!_0!"
  16. set "_1=!_0:0=x!"
  17. set "_2=!_0:0=y!"
  18. set "_3=!_0:0=z!"
  19. set NL=^



  20. for /l %%p in (1 1 99) do (
  21.   title %%p
  22.   set /a "rMax=%%p-1"

  23.   if !rMax! lss 4 ( rem 同心圆算法, 效率太低, 故仅在半径小于 4 时处理
  24.     for /l %%l in (-!rMax! 1 !rMax!) do (
  25.       set "L="
  26.       set /a "a=%%l, t=a>>31, a=(a+t)^t"
  27.       for /l %%c in (-!rMax! 1 !rMax!) do (
  28.         set /a "b=%%c, t=b>>31, b=(b+t)^t"
  29.         set /a "t=(a-b)>>31, r=(t&b)|(~t&a), rd=r-rMax-1"

  30.         if !r!==0 (
  31.           if !rMax! geq 3 (set "L=!L!1") else set "L=!L!!CS:~-%%p,1!"
  32.         ) else (
  33.           if !rd! lss -3 (
  34.             set "L=!L!0"
  35.           ) else (
  36.             for %%i in (!rd!) do set "L=!L!!CS:~%%i,1!"
  37.           )
  38.         )
  39.       )
  40.       echo,!L!
  41.     )
  42.   ) else ( rem 在半径不小于 4 时, 切换为高效率算法

  43.     set "S3=" & set "E3="
  44.     for %%i in (1 2 3) do (
  45.       set /a "s=2*(rMax-%%i)+1"
  46.       for %%s in (!s!) do (
  47.         set "S3=!S3!!NL!!CSR:~0,%%i!!_%%i:~-%%s!!CS:~-%%i!"
  48.         set "E3=!CSR:~0,%%i!!_%%i:~-%%s!!CS:~-%%i!!NL!!E3!"
  49.       )
  50.     )

  51.     set /a "s=rMax-3"
  52.     for %%s in (!s!) do set "LC=xyz!_0:~-%%s!1!_0:~-%%s!zyx"
  53.     set "Ln=!LC:1=0!"

  54.     echo,!S3:~1!
  55.     for /l %%i in (1 1 !s!) do echo,!Ln!
  56.     echo,!LC!
  57.     for /l %%i in (1 1 !s!) do echo,!Ln!
  58.     echo,!E3:~0,-1!

  59.   )
  60.   pause & cls
  61. )
复制代码

评分

参与人数 1技术 +1 收起 理由
plp626 + 1 很好。。。

查看全部评分

 楼主| 发表于 2012-6-8 16:53:54 | 显示全部楼层
我是用C写的
  1. ,#include <stdio.h>
  2. #define  ABS(X)  ((X)>=0 ? (X) : (-(X)))

  3. int main(int argc, char **argv)
  4. {
  5.         argc != 2 ? printf("Usage: %s", "Missing!"),exit(1) : 0;
  6.         int c,n=0;
  7.         while(c=*argv[1]++)
  8.                 n = n * 10 + c - '0';

  9.         int i, j, ii, jj, map[100]={'x','y','z'};

  10.         for (i=3; i<n-1; i++)
  11.                 map[i]='0';
  12.         n>3 ? map[n-1]='1': 0;

  13.         for (i=0; i<2*n-1; i++){
  14.                 for (j=0; j<2*n-1; j++){
  15.                         ii = ABS(n-i-1),jj = ABS(n-j-1);
  16.                         printf("%c ",map[n-1-(ii>jj ? ii:jj)]);
  17.                 }
  18.                 printf("\n");
  19.         }
  20.        
  21.         return 0;
  22. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-16 23:31 , Processed in 0.018838 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表