Board logo

标题: [出题]批处理趣味数学之n阶蛇形方阵 [打印本页]

作者: HAT     时间: 2008-8-26 00:58    标题: [出题]批处理趣味数学之n阶蛇形方阵

要求:输入1到9之间的一位数字,输出相应的n阶蛇形方阵。如图所示:



解决方案见8、17、19、21、26、28楼。

[ Last edited by HAT on 2009-2-22 at 16:43 ]
作者: dragonamd     时间: 2008-8-26 01:08
这问题,。。要好好研究

[ Last edited by dragonamd on 2008-8-26 at 01:48 AM ]
作者: pusofalse     时间: 2008-8-26 01:15
这问题。。好好想想。。

[ Last edited by pusofalse on 2008-8-26 at 01:16 AM ]
作者: HAT     时间: 2008-8-26 01:17    标题: Re 2楼

友情提示:
在CN-DOS抢沙发,后果很严重!可能很多人会扣你的分,有可能因为一个沙发让自己的积分变成负值。
作者: dragonamd     时间: 2008-8-26 01:46
啊!后果真的很严重!做在沙发上起又起不来,怎么办呢
作者: pusofalse     时间: 2008-8-26 06:29
这题好复杂,感觉必须先生成第一行,下面才有得做。
作者: slore     时间: 2008-8-26 10:35
规律性挺强的。
作者: slore     时间: 2008-8-26 12:31    标题: 我就抛下砖拉

CODE:  [Copy to clipboard]
@echo off&setlocal enabledelayedexpansion
set flag=i&set i=1&set j=1
set /p n=输入阶数:
set /a nn=n*n
for /l %%a in (1,1,%nn%) do (
    if %%a LSS 10 (set _!i!!j!= %%a) else set _!i!!j!=%%a
    if !flag!==i (if !i! GTR 1 (set/a i-=1&set/a j+=1) else (set/a j+=1&set flag=j)) else (if !j! GTR 1 (set/a j-=1&set/a i+=1) else (set/a i+=1&set flag=i))
    if !i! GTR %n% set/a i-=1&set/a j+=1
    if !j! GTR %n% set/a i+=1&set/a j-=1
    if !i! EQU %n% if defined _!i!!j! set/a j+=1&set flag=i
    if !j! EQU %n% if defined _!i!!j! set/a i+=1&set flag=j
)

for /l %%m in (1,1,%n%) do (
    for /l %%n in (1,1,%n%) do (
       set /p =!_%%m%%n! <nul
     )
    echo.
)
pause>nul

作者: HAT     时间: 2008-8-26 13:23    标题: Re 9楼

Nice job!
作者: pusofalse     时间: 2008-8-26 16:18
T.T看到slore前辈的解,真的是太棒了。
相比我的解,杂之又杂。
作者: HAT     时间: 2008-8-26 16:24    标题: Re 11楼

贴出来鉴赏一下?
作者: pusofalse     时间: 2008-8-26 16:49
好长的代码。。。我厚着脸皮贴上来。。。
CODE:  [Copy to clipboard]
@echo off&setlocal enabledelayedexpansion
set/a n=1,m=2
set "var=%n% %m% "
for /l %%a in (1 1 4) do (
        set/a n=%%a"<<"2,m+=n,z=m+1
              set "var=!var!!m! !z! "
        set/a m=z
)
for %%a in (%var%) do set "_var0=!_var0!%%a "
:loop
set/a n=0,s+=1,m=s%%2
if %m% equ 1 (set "com1=+"&set "com2=-") else set "com1=-"&set "com2=+"
for %%a in (%var%) do (
     set/a n+=1,m=n%%2
     if !m! equ 0 (
         set/a z=%%a%com1%1
         set "_var%s%=!_var%s%!!z! "
         ) else (
         if !n! neq 1 (
            set/a z=%%a%com2%1
            set "_var%s%=!_var%s%!!z! "
         )
     )
)
set "var=!_var%s%!"
if %s% neq 8 goto loop
set/a n=0
for /l %%i in (0 1 8) do (
    for %%c in (!_var%%i!) do set "last=%%c"
    call,set "_var%%i=%%_var%%i:!last!=%%"
    if %%i equ 0 for %%a in (!_var%%i!) do set "last1=%%a"
)
:lp
if not defined faith (set "com1=+"&set "num=8") else (set "com1=-"&set "num=0")
set/a n%com1%=1,x=0
for %%a in (!_var%n%!) do set/a x+=1
if %x% lss 9 set/a last1+=1&set "_var%n%=!_var%n%!!last1! "
if %n% neq %num% goto lp
for %%a in (!_var%n%!) do set/a x+=1
if %x% lss 9 set/a last1+=1,x=0&set "_var%n%=!_var%n%!!last1! "
if not defined faith (set faith=faith) else set "faith="
set x=0
for %%a in (!_var8!) do set/a x+=1
if %x% neq 9 goto lp
for /f "tokens=2 delims==" %%a in ('set _') do (
     for %%i in (%%a) do (
        if %%i lss 10  (<nul set/p=  %%i) else <nul set/p= %%i
     )
     echo.
)
pause>nul

作者: slore     时间: 2008-8-26 17:26
先能实现就好。

倒是HAT图中的test.bat
作者: HAT     时间: 2008-8-26 21:13    标题: Re 13楼

直接把9阶方阵输出了,不能接收输入吗?
作者: radem     时间: 2008-8-26 21:33
高手出招真不同凡响......羡慕!
作者: 523066680     时间: 2008-8-26 21:41


  Quote:
Originally posted by slore at 2008-8-26 05:26 PM:
先能实现就好。

倒是HAT图中的test.bat

哎没办法kof97的boss大蛇总是最后出场
作者: bat-zw     时间: 2008-8-26 22:52    标题: 几乎被转晕

代码写的确实难读,但总还是实现了(修改后不用set排序提高效率):
CODE:  [Copy to clipboard]
@echo off&setlocal enabledelayedexpansion
set /p num=请输入蛇阵级数:
set /a x=1,y=1,tt=num*num,min=1,max=1,ys=num%%2,tt1=tt-2
if %tt% lss 10 set "tt= %tt%"
set "+=+"
if %ys% equ 0 (set "jx=%num%1") else (set "jx=1%num%")
:lp
if %x%%y% equ %jx% set "back=a"&set "+=-"
set /a n%+%=1,ys=n%%2
if %ys% equ 0 (
   set "x+=+"&set "y+=-"&set "ss=y+"
   if defined back set "ss=x+"
   ) else (
   set "x+=-"&set "y+=+"&set "ss=x+"
   if defined back set "ss=y+"
)
if %n% gtr 1 set /a min=max+1,max+=n
if %min% equ %tt1% set /a max+=1
for /l %%a in (%min%,1,%max%) do (
    set "str=%%a"&set /a m+=1
    if !str! lss 10 set "str= %%a"
    if %%a neq 1 (
       if not defined flag (
          set /a %ss%=1&set "flag=a"
          ) else (
          if !m! lss %tt% set /a x%x+%=1,y%y+%=1
       )
    )
    call,set "str!x!=%%str!x!%% !str!"
    )
)
if %m% lss %tt% set "flag="&goto lp
for /l %%i in (1,1,%num%) do echo !str%%i!
pause>nul
[ Last edited by bat-zw on 2008-8-26 at 11:54 PM ]
作者: slore     时间: 2008-8-26 22:55    标题:


好多引号~~
作者: HAT     时间: 2008-8-28 15:42
我的
CODE:  [Copy to clipboard]
@echo off
setlocal enabledelayedexpansion
set /p n=What's the bands of your Snake Matrix?[1-9]
set x=1
for /l %%i in (1,1,%n%) do (
  set /a f=%%i%%2
  if !f! equ 1 (
    set k=%%i
    set l=1
    call :LeftOdd
  ) else (
    set k=1
    set l=%%i
    call :LeftEven
  )
)
set /a tn=n-1
for /l %%i in (%tn%,-1,1) do (
  set /a f=%%i%%2
  if !f! equ 1 (
    set k=%n%
    set /a l=%n%-%%i
    set /a l+=1
    set kn=!l!
    call :RightOdd
  ) else (
    set /a k=%n%-%%i
    set /a k+=1
    set l=%n%
    set ln=!k!
    call :RightEven
  )
)
set row=
for /l %%i in (1,1,%n%) do (
  for /l %%j in (1,1,%n%) do (
    call set num=!a%%i%%j!
    if !num! leq 9 (
      set num= !num!
    )
    call set row=!row! !num!
  )
  echo !row!
  set row=
)
goto :eof

:LeftOdd
set a%k%%l%=%x%
set /a k-=1
set /a l+=1
set /a x+=1
if !k! geq 1 (
  goto :LeftOdd
) else (
  goto :eof
)

:LeftEven
set a%k%%l%=%x%
set /a k+=1
set /a l-=1
set /a x+=1
if !l! geq 1 (
  goto :LeftEven
) else (
  goto :eof
)

:RightOdd
set a%k%%l%=%x%
set /a k-=1
set /a l+=1
set /a x+=1
if !k! geq !kn! (
  goto :RightOdd
) else (
  goto :eof
)

:RightEven
set a%k%%l%=%x%
set /a k+=1
set /a l-=1
set /a x+=1
if !l! geq !ln! (
  goto :RightEven
) else (
  goto :eof
)

作者: BC     时间: 2008-8-28 16:21
好长...
作者: terse     时间: 2008-8-28 19:41
CODE:  [Copy to clipboard]
@echo off&setlocal enabledelayedexpansion
set /p p=输入级数:
set/a n=1,m=1,x=n
:lp
set/a a+=1
set %n%%m%=%a%
if %p% equ 1 goto ok
if defined x (
if "%x%#"=="1#" (set/a m+=1,x=m)else (
   if %m% equ 1 (
   if %n% equ %p% (set/a m+=1,y=n&set x=)else (
   set/a n+=1,y=n&set x=))else (
   if %n% equ %p% (set/a m+=1,y=n&set x=)else (
   set/a m-=1,n+=1)))
   )else if "%y%#"=="1#" (set/a n+=1,y=m)else (
   if %n% equ 1 (
   if %m% equ %p% (set/a n+=1,x=m&set y=)else (set/a m+=1,x=m&set y=))else (
   if %m% equ %p% (set/a n+=1,x=m&set y=)else (
   set/a m+=1,n-=1)))
   if %n% equ %m% (
       if %m% equ %p% (
       set/a a+=1
       set %n%%m%=!a!
       goto ok
       )else goto lp
    )else goto lp
:ok
for /l %%i in (1,1,%p%) do (
    for /l %%j in (1,1,%p%) do (
       if !%%i%%j! lss 10 (set /p = !%%i%%j! <nul)else set /p =!%%i%%j! <nul
     )
    echo.
)
pause>nul
[ Last edited by terse on 2008-8-28 at 11:37 PM ]
作者: HAT     时间: 2008-8-28 22:42    标题: Re 22楼

阶数为1的时候代码死掉了?
作者: terse     时间: 2008-8-28 23:36


  Quote:
Originally posted by HAT at 2008-8-28 22:42:
阶数为1的时候代码死掉了?

确实  其实第一个循环的时候 %M%是2了 所以就在前面加个判断吧
作者: 523066680     时间: 2008-8-30 10:13
我的代码很长,但是 我尽力了  没有遗憾。
思路-----逐行添加,控制添加的行是哪些
CODE:  [Copy to clipboard]
@echo off &setlocal enabledelayedexpansion
for /l %%a in (1,1,9) do set _%%a=exist
:act
set /p input="1-9:"
if defined _%input% (goto :action) else (goto :act)
:action
set /a a=0,n=0
:a
set /a a+=1,a1=0
set /a jiou=a%%2
   :a1
   set /a a1+=1,n+=1
   if %n% leq 9 (set "k=  ") else (set "k= ")
   if %jiou% equ 0 (
        set line%a1%=!line%a1%!%k%%n%
   ) else (
      set /a l=a-a1+1
      call,set line!l!=%%line!l!%%%k%%n%
   )
   if %a1% lss %a% (goto :a1)
if %a% lss %input% (goto :a)
if %input% gtr 1 (goto :baction) else (echo,1&pause&exit)
:baction
set /a b=0,new=input-1
:b
set /a b+=1
set /a b1=b,jiou=(input-b)%%2
   :b1
   set /a b1+=1,n+=1
   if %n% leq 9 (set "k=  ") else (set "k= ")
   if %jiou% equ 0 (
      set line%b1%=!line%b1%!%k%%n%
   ) else (
      set /a l=input-b1+b+1
      call,set line!l!=%%line!l!%%%k%%n%
   )
   if %b1% lss %input% (goto :b1)
if %b% lss %new% (goto :b)
for /l %%a in (1,1,9) do echo,!line%%a!
pause  

作者: HAT     时间: 2008-8-30 10:29    标题: Re 25楼

空字符多了点^_^
作者: plp626     时间: 2008-9-5 16:37    标题: 来迟了

想了个算法:

等差数列:
A11              
A12     A21
A31     A32     A33
...
即:
1
2    3
4    5    6
...
-------------------------
A(1,1)+A(n,n)=A(1,2)+A(n,n-1)=A(2,1)+A(n-1,n)=...=n*n+1
CODE:  [Copy to clipboard]
@echo off||plp626@cn-dos.net&setlocal enabledelayedexpansion

set/p n=蛇形方阵阶数?[1-10]

for /l %%a in (1 1 %n%)do (set/a q=1+%%a
   if not defined t (set t=\&call:x %%a -1 1) else set t=&call:x 1 1 %%a
)

for /l %%a in (1 1 %n%)do echo\&for /l %%b in (1 1 %n%)do (
   if !.%%a%%b! lss 10 (set/p=  !.%%a%%b!<nul) else set/p= !.%%a%%b!<nul
)
echo\&pause>nul

:x
for /l %%b in (%1 %2 %3)do (set/a r=q-%%b,m+=1,s=n+1-%%b,o=n+1-q+%%b
    set/a .%%b!r!=!m!,.!s!!o!=n*n+1-!m!
)
exit/b

作者: HAT     时间: 2008-9-5 18:07    标题: Re 27楼

Long time no see. Nice job!
作者: 523066680     时间: 2008-9-6 09:55
我相信我可以的!!!我缩!
CODE:  [Copy to clipboard]
@echo off &setlocal enabledelayedexpansion
set /p input="1-9:"
set /a end=input*input+1
:a
set /a a+=1,a1=0,jiou=a%%2
  :a1
  set /a a1+=1,n+=1,end-=1
  set /a a2=a+1-a1,b1=input+1-a1,b2=input-a+a1
  if %n% leq 9 (set "k=  ") else (set "k= ")
  if %end% leq 9 (set "k2=  ") else (set "k2= ")
  if %jiou% equ 0 (set /a ta=a1,te=b1) else (set /a ta=a2,te=b2)
     set line%ta%=!line%ta%!%k%%n%
     if %a% lss %input% set line2%te%=%k2%%end%!line2%te%!
  if %a1% lss %a% (goto :a1)
if %a% lss %input% (goto :a)
for /l %%a in (1,1,%input%) do echo,!line%%a!!line2%%a!
pause
[ Last edited by 523066680 on 2008-9-6 at 10:08 AM ]
作者: plp626     时间: 2008-9-6 10:20
re:29
哥哥给你加油!
作者: 523066680     时间: 2009-2-22 16:41
用 挤牙膏的思路做的  比如 变量h代表行

依次是 1
          1 2
          3 2 1
          1 2 3 4
          5 4 3 2 1 ……
这样按行添加一个 累加的数
作者: zhoumeng     时间: 2009-2-22 17:36
Nice job!
作者: wangfangjian     时间: 2009-2-22 22:21
高手就是不一样
作者: netbenton     时间: 2009-2-26 01:57    标题: 我做的两头蛇,19阶内哦!

::不难看出,两头转时变量使用是一样的
::一头蛇时转时,到了尾部变量就要反咬过来,麻烦
::还不如两做成两头蛇,最后双蛇合璧

@echo off&setlocal enabledelayedexpansion
set /p num=输入阶数:
set/a n=1,k=1,a=n,z=num,m=num*num,j=1+2
set g=%m% 987654321
set g=%g:~9,1%
:lp

set nn=   %n%
set l%a%=!l%a%!!nn:~-%g%!
set/a n+=1
if !m! lss !n! goto :quit

set mm=   %m%
set r%z%=!mm:~-%g%!!r%z%!
set/a m-=1
if !m! lss !n! goto :quit

set/a a=a-k,z=z+k

if 0==!a! set/a a=1,z=num,k=-1
if !j!==!a! set/a j+=2,k=1
goto :lp

:quit
for /l %%a in (1,1,%num%) do echo !l%%a!!r%%a!

pause

[ Last edited by netbenton on 2009-2-26 at 00:11 ]
作者: 523066680     时间: 2009-2-26 05:49
我那也是两头的~    解释的时候没说

见过很多你的回帖 不错的~    加分。
作者: netbenton     时间: 2009-2-26 07:54    标题: 换个post玩玩

@echo off&setlocal enabledelayedexpansion
set /p num=输入蛇形方阵阶数(1-20):
set/a n=1,k=1,a=n,z=num,m=num*num,j=1+2
set g=%m% 987654321
set g=%g:~9,1%
:lp

set nn=   %n%
set l%a%=!nn:~-%g%!!l%a%!
set/a n+=1
if !m! lss !n! goto :quit

set mm=   %m%
set r%z%=!r%z%!!mm:~-%g%!
set/a m-=1
if !m! lss !n! goto :quit

set/a a=a-k,z=z+k

if 0==!a! set/a a=1,z=num,k=-1
if !j!==!a! set/a j+=2,k=1
goto :lp

:quit
for /l %%a in (1,1,%num%) do echo !r%%a!!l%%a!

pause




欢迎光临 中国DOS联盟论坛 (http://cndos.fam.cx/forum/) Powered by Discuz! 2.5