[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
本帖最后由 hanyeguxing 于 2011-8-16 21:17 编辑

蛇形:
  1. @echo off&set/a c=9
  2. for /l %%a in (1 1 %c%) do (
  3.     for /l %%b in (1 1 %c%) do set/a "d=%%a+%%b-1,e=(%%a+%%b)%%2,f=e*((d*d-d)/2+%%a)+!e*((d*d+d)/2-%%a+1)-!!(d/(c+1))*(d-c)*(d-c)+100"&call set/p=%%f:~-2%% <nul
  4.     echo;
  5. )
复制代码
顺时针:
  1. @echo off&set c=9
  2. for /l %%a in (1,1,%c%) do (
  3.     for /l %%b in (1,1,%c%) do set/a "d=!!(%%b/%%a)*!(%%b/(c-%%a+2))*(4*(c-%%a)*%%a-4*c+7*%%a+%%b-3)+!(%%b/(%%a+1))*!!(%%b/(c-%%a+2))*(4*(c-%%a)*%%a-2*c+5*%%a-%%b-1)+!!(%%b/(%%a+1))*!!(%%b/(c-%%a+2))*(4*(c-%%b)*%%b-2*c+%%a+3*%%b-1)+!(%%b/%%a)*!(%%b/(c-%%a+2))*(4*(c-%%b)*%%b-%%a+%%b+1)+100"&call set/p=%%d:~-2%% <nul
  4.     echo;
  5. )
复制代码
逆时针原理同上。。。
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

本帖最后由 hanyeguxing 于 2011-8-17 11:59 编辑

回复 6# hanyeguxing


   
01 02 06 07 15 16 28 29 45
03 05 08 14 17 27 30 44 46
04 09 13 18 26 31 43 47 60
10 12 19 25 32 42 48 59 61
11 20 24 33 41 49 58 62 71
21 23 34 40 50 57 63 70 72
22 35 39 51 56 64 69 73 78
36 38 52 55 65 68 74 77 79
37 53 54 66 67 75 76 80 81

  所谓蛇形,实际是指从左上顶点开始,按斜线的连续数列。我们这样分析(以下算法由寒夜孤星原创):
1,将整个图形以 45-37 开始的斜线分割,只看左半部分。
2,整个表达式以 for 跌代嵌套设置坐标,如 for /l %%a in (1 1 %c%) do for /l %%b in (1 1 %c%) do ,%%a 为行,%%b 为列,%c% 为阶数。
3,我们提取每条斜线里最小的数字,分别是 1  2  4  7 11 16 22 29 37  ... 。这个数列可以用 (n-1)*n/2+1 计算。
以第一行为例,则 (%%b-1)*%%b/2+1 。以下每行向左移动一次,即 (%%b-1+%%a-1)*(%%b-1+%%a)/2+1 ,即  (%%a+%%b-1-1)*(%%b-1+%%a)/2+1 。
令 d=%%a+%%b-1 ,则 (d-1)*d/2+1 即 (d*d-d)/2+1 。
4,我们提取每条斜线里最大的数字,分别是 1  3  6 10 15 21 28 36 45  ... 。这个数列可以用 (n+1)*n/2 计算。
以第一行为例,则 (%%b+1)*%%b/2 。以下每行向左移动一次,即 (%%b-1+%%a+1)*(%%b-1+%%a)/2 ,即  (%%a+%%b-1+1)*(%%b-1+%%a)/2 。
令 d=%%a+%%b-1 ,则 (d+1)*d/2+1 即 (d*d+d)/2 。
5,我们以坐标 (xy)大 、 (xy)小 来表示自上而下分别从最大数、最小数开始的规律
11大 12小 13大 14小 15大 16小 17大 18小 19大
21小 22大 23小 24大 25小 26大 27小 28大 29小
31大 32小 33大 34小 35大 36小 37大 38小 39大
41小 42大 43小 44大 45小 46大 47小 48大 49小
...省略...
数学规律是 e=(%%a+%%b)%%2 ,当余数为 0 时大,余数为 1 时小。
6,综合以上,我们得到一个批处理:
  1. @echo off&set/a c=9
  2. for /l %%a in (1 1 %c%) do (
  3.     for /l %%b in (1 1 %c%) do set/a "d=%%a+%%b-1,e=(%%a+%%b)%%2,f=e*((d*d-d)/2+%%a)+!e*((d*d+d)/2-%%a+1)+100"&call set/p=%%f:~-2%% <nul
  4.     echo;
  5. )
  6. pause
复制代码
输出结果:
01   02   06   07   15   16   28   29   45 (46) (66) (67) (91) (92) (20) (21) (53)
03   05   08   14   17   27   30   44   47 (65) (68) (90) (93) (19) (22) (52)
04   09   13   18   26   31   43   48   64 (69) (89) (94) (18) (23) (51)
10   12   19   25   32   42   49   63   70 (88) (95) (17) (24) (50)
11   20   24   33   41   50   62   71   87 (96) (16) (25) (49)
21   23   34   40   51   61   72   86   97 (15) (26) (48)
22   35   39   52   60   73   85   98   14 (27) (47)
36   38   53   59   74   84   99   13   28 (46)
37   54   58   75   83   00   12   29   45
(55) (57) (76) (82) (01) (11) (30) (44)
(56) (77) (81) (02) (10) (31) (43)
(78) (80) (03) (09) (32) (42)
(79) (04) (08) (33) (41)
(05) (07) (34) (40)
(06) (35) (39)
(36) (38)
(37)
7,对比此结果与标准输出,左半部分与要求一致,需要修正的是右半部分,与要求的区别是:
自左向右,每斜线之间差为 n*n (上、下大小半个三角相加即为正方形),即 (%%a+%%b-1-c)*(%%a+%%b-1-c) 。
8,使用 !!((%%a+%%b-1)/(c+1)) 定位这些右半部分斜线。
9,综合得到代码:
  1. @echo off&set/a c=9
  2. for /l %%a in (1 1 %c%) do (
  3.     for /l %%b in (1 1 %c%) do set/a "d=%%a+%%b-1,e=(%%a+%%b)%%2,f=e*((d*d-d)/2+%%a)+!e*((d*d+d)/2-%%a+1)-!!(d/(c+1))*(d-c)*(d-c)+100"&call set/p=%%f:~-2%% <nul
  4.     echo;
  5. )
  6. pause
复制代码
2

评分人数

    • CrLf: 漂亮技术 + 1
    • plp626: 规律找得好;建议直接把数学关系写出直观些 ...技术 + 1
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

返回列表