标题: 批处理 输出方框 [打印本页]
作者: plp626 时间: 2012-5-22 18:32 标题: 批处理 输出方框
本帖最后由 plp626 于 2012-5-22 18:36 编辑
网上找来的一个练习题, 有些人的代码走了弯路,发来看看大家的结果;- -->test 1
- x
-
- -->test 2
- x x x
- x y x
- x x x
-
- -->test 3
- x x x x x
- x y y y x
- x y z y x
- x y y y x
- x x x x x
-
- -->test 4
- x x x x x x x
- x y y y y y x
- x y z z z y x
- x y z 1 z y x
- x y z z z y x
- x y y y y y x
- x x x x x x x
-
- -->test 5
- x x x x x x x x x
- x y y y y y y y x
- x y z z z z z y x
- x y z 0 0 0 z y x
- x y z 0 1 0 z y x
- x y z 0 0 0 z y x
- x y z z z z z y x
- x y y y y y y y x
- x x x x x x x x x
-
- -->test 6
- x x x x x x x x x x x
- x y y y y y y y y y x
- x y z z z z z z z y x
- x y z 0 0 0 0 0 z y x
- x y z 0 0 0 0 0 z y x
- x y z 0 0 1 0 0 z y x
- x y z 0 0 0 0 0 z y x
- x y z 0 0 0 0 0 z y x
- x y z z z z z z z y x
- x y y y y y y y y y x
- x x x x x x x x x x x
-
- -->test 7
- x x x x x x x x x x x x x
- x y y y y y y y y y y y x
- x y z z z z z z z z z y x
- x y z 0 0 0 0 0 0 0 z y x
- x y z 0 0 0 0 0 0 0 z y x
- x y z 0 0 0 0 0 0 0 z y x
- x y z 0 0 0 1 0 0 0 z y x
- x y z 0 0 0 0 0 0 0 z y x
- x y z 0 0 0 0 0 0 0 z y x
- x y z 0 0 0 0 0 0 0 z y x
- x y z z z z z z z z z y x
- x y y y y y y y y y y y x
- x x x x x x x x x x x x x
复制代码
规律就是如此(test后面的参数 小于100),请编写一个批处理程序,实现以上输出
作者: CrLf 时间: 2012-5-22 18:40
set /a 一族表示无压力
^_^
作者: plp626 时间: 2012-5-22 18:41
不准骄傲, 赛代码。。。
作者: neorobin 时间: 2012-5-22 21:03
本帖最后由 neorobin 于 2012-6-2 11:27 编辑
想到 3 种思路:
外扩, 内填, 拟出规则直接生成
其实是若干个同心 " 圆 ", 根据与 圆心 的距离, 可以很简单的确定 字符
作者: neorobin 时间: 2012-5-22 22:56
抢先发一个同心圆算法的- @echo off & setlocal enabledelayedexpansion
- set "CS=zyx"
- for /l %%p in (1 1 99) do (
- set /a "rMax=%%p-1"
- for /l %%l in (-!rMax! 1 !rMax!) do (
- set "L="
- set /a "a=%%l, t=a>>31, a=(a+t)^t"
- for /l %%c in (-!rMax! 1 !rMax!) do (
- set /a "b=%%c, t=b>>31, b=(b+t)^t"
- set /a "t=(a-b)>>31, r=(t&b)|(~t&a), rd=r-rMax-1"
-
- if !r!==0 (
- if !rMax! geq 3 (set "L=!L!1") else set "L=!L!!CS:~-%%p,1!"
- ) else (
- if !rd! lss -3 (
- set "L=!L!0"
- ) else for %%i in (!rd!) do set "L=!L!!CS:~%%i,1!"
- )
- )
- echo,!L!
- )
- pause & cls
- )
复制代码
作者: neorobin 时间: 2012-5-23 00:30
本帖最后由 neorobin 于 2012-6-2 11:26 编辑
将 半径 大于或等于 4 时, 调整为 高效算法- @echo off & setlocal enabledelayedexpansion
- if "%1"=="" (
- for %%a in ( FontSize:00080008
- FontFamily:00000030
- WindowSize:00c700c7
- ScreenColors:0000000f
- CodePage:000001b5
- ScreenBufferSize:00c700c7
- ) do for /f "tokens=1,2 delims=:" %%b in ("%%a") do (
- >nul reg add HKCU\Console\CharBox /v %%b /t reg_dword /d 0x%%c /f
- )
- start "CharBox" /max "%ComSpec%" /c "%~f0" 1&goto:eof
- ) else ( >nul reg delete HKCU\Console\CharBox /f )
-
-
- set "CS=zyx" & set "CSR=xyz"
- for /l %%p in (1 1 200) do set "_0=0!_0!"
- set "_1=!_0:0=x!"
- set "_2=!_0:0=y!"
- set "_3=!_0:0=z!"
- set NL=^
-
-
-
- for /l %%p in (1 1 99) do (
- title %%p
- set /a "rMax=%%p-1"
-
- if !rMax! lss 4 ( rem 同心圆算法, 效率太低, 故仅在半径小于 4 时处理
- for /l %%l in (-!rMax! 1 !rMax!) do (
- set "L="
- set /a "a=%%l, t=a>>31, a=(a+t)^t"
- for /l %%c in (-!rMax! 1 !rMax!) do (
- set /a "b=%%c, t=b>>31, b=(b+t)^t"
- set /a "t=(a-b)>>31, r=(t&b)|(~t&a), rd=r-rMax-1"
-
- if !r!==0 (
- if !rMax! geq 3 (set "L=!L!1") else set "L=!L!!CS:~-%%p,1!"
- ) else (
- if !rd! lss -3 (
- set "L=!L!0"
- ) else (
- for %%i in (!rd!) do set "L=!L!!CS:~%%i,1!"
- )
- )
- )
- echo,!L!
- )
- ) else ( rem 在半径不小于 4 时, 切换为高效率算法
-
- set "S3=" & set "E3="
- for %%i in (1 2 3) do (
- set /a "s=2*(rMax-%%i)+1"
- for %%s in (!s!) do (
- set "S3=!S3!!NL!!CSR:~0,%%i!!_%%i:~-%%s!!CS:~-%%i!"
- set "E3=!CSR:~0,%%i!!_%%i:~-%%s!!CS:~-%%i!!NL!!E3!"
- )
- )
-
- set /a "s=rMax-3"
- for %%s in (!s!) do set "LC=xyz!_0:~-%%s!1!_0:~-%%s!zyx"
- set "Ln=!LC:1=0!"
-
- echo,!S3:~1!
- for /l %%i in (1 1 !s!) do echo,!Ln!
- echo,!LC!
- for /l %%i in (1 1 !s!) do echo,!Ln!
- echo,!E3:~0,-1!
-
- )
- pause & cls
- )
复制代码
作者: plp626 时间: 2012-6-8 16:53
我是用C写的- ,#include <stdio.h>
- #define ABS(X) ((X)>=0 ? (X) : (-(X)))
-
- int main(int argc, char **argv)
- {
- argc != 2 ? printf("Usage: %s", "Missing!"),exit(1) : 0;
- int c,n=0;
- while(c=*argv[1]++)
- n = n * 10 + c - '0';
-
- int i, j, ii, jj, map[100]={'x','y','z'};
-
- for (i=3; i<n-1; i++)
- map[i]='0';
- n>3 ? map[n-1]='1': 0;
-
- for (i=0; i<2*n-1; i++){
- for (j=0; j<2*n-1; j++){
- ii = ABS(n-i-1),jj = ABS(n-j-1);
- printf("%c ",map[n-1-(ii>jj ? ii:jj)]);
- }
- printf("\n");
- }
-
- return 0;
- }
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |