Board logo

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

作者: HAT     时间: 2008-8-26 23:59    标题: [出题]批处理趣味数学之n阶螺旋方阵

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



[ Last edited by HAT on 2008-8-30 at 11:20 AM ]
作者: bat-zw     时间: 2008-8-27 00:03
效率有点慢,夜深了,明天再来

[ Last edited by bat-zw on 2008-8-27 at 02:18 AM ]
作者: slore     时间: 2008-8-27 00:51
直线比折线好走哦
作者: slore     时间: 2008-8-27 02:16    标题: 继续抛

CODE:  [Copy to clipboard]
@echo off&setlocal enabledelayedexpansion
set flag=i&set i=1&set j=1&set o=+
set /p n=输入阶数:
set /a nn=n*n
set /a n1=n+1
set _1%n1%=Sl挡&set _%n1%%n%=o顶&set _%n%0=re推
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 !o!==+ (set/a j+=1) else (set/a j-=1)) else (if !o!==+ (set/a i+=1) else (set/a i-=1))
    if defined _!i!!j! (if !flag!==i (set flag=j&(if !o!==+ (set/a i+=1&set/a j-=1) else (set/a i-=1&set/a j+=1))) else ((if !o!==+ (set o=-) else (set o=+))&(if !o!==+ (set/a i+=1&set/a j+=1) else (set/a i-=1&set/a j-=1))&set flag=i))
)

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

作者: slore     时间: 2008-8-27 02:17    标题: 郁闷~

set o=+
如果支持
set/a i!o!=1代码能少很多……本来这样写的,结果。。。运算符不存在=。=害得ififif~~((()))
作者: slore     时间: 2008-8-27 08:44    标题: 果然晚上晕些……

o改用1和-1表示,代码大量简化,而且可读性强了些,一看就明白走法了。
CODE:  [Copy to clipboard]
@echo off&setlocal enabledelayedexpansion
set flag=i&set i=1&set j=1&set o=1
set /p n=输入阶数:
set /a nn=n*n
set /a n1=n+1
set _1%n1%=Sl挡&set _%n1%%n%=o顶&set _%n%0=re推
for /l %%a in (1,1,%nn%) do (
    if %%a LSS 10 (set _!i!!j!= %%a) else set _!i!!j!=%%a
    if !flag!==i  (set/a j+=!o!) else set/a i+=!o!
    if defined _!i!!j! (if !flag!==i (set flag=j&set/a i+=!o!&set/a j-=!o!) else (set flag=i&(set/a o=-!o!)&set/a i+=!o!&set/a j+=!o!))
)

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

作者: bat-zw     时间: 2008-8-27 11:33    标题: 来一个goto+for的

CODE:  [Copy to clipboard]
@echo off&setlocal enabledelayedexpansion
set /p var=请输入螺旋阵级数:
for /l %%a in (1,1,%var%) do (
    for /l %%i in (1,1,%var%) do (
        if %%a%%i equ 11 (
           set "str1=  1"
           ) else (              
           set "str%%a=!str%%a! %%a%%i"
        )
    )
)
set /a x=1,y=1,totle=var*var,tt=1,n=0,m=1,num=var+1
:begin
set /a num-=1,n+=1,m+=1
:y+
set /a y+=1&call :lp
if %y% lss %num% goto y+
:x+
set /a x+=1&call :lp
if %x% lss %num% goto x+
:y-
set /a y-=1&call :lp
if %y% gtr %n% goto y-
:x-
set /a x-=1&call :lp
if %x% gtr %m% goto x-
if %tt% lss %totle% goto begin
for /l %%i in (1,1,%var%) do echo !str%%i!
pause>nul&goto :eof
:lp
set /a tt+=1
if %tt% lss 10 set "tt= %tt%"
set "a=!str%x%!"
set "a=!a:%x%%y%=%tt%!"
set "str%x%=%a%"

作者: bat-zw     时间: 2008-8-27 13:39    标题: 简化

但代码却显得难读了,真是不可两全啊。。。
CODE:  [Copy to clipboard]
@echo off&setlocal enabledelayedexpansion
set /p var=请输入螺旋阵级数(9级内):
set /a x=1,y=1,total=var*var,tt=1,n=0,m=1,num=var+1
:begin
set /a num-=1,n+=1,m+=1
set "s=y+x+y-x-"&set "ss=%num%%num%%n%%m%"&set "gl=lsslssgtrgtr"
:again
set /a %s:~,2%=1,tt+=1
if %tt% lss 10 set "tt= %tt%"
if not defined _%x%%y% set "_%x%%y%=%tt%"
if !%s:~,1%! %gl:~,3% %ss:~,1% goto again
set "s=%s:~2%"&set "ss=%ss:~1%"&set "gl=%gl:~3%"
if defined s goto again
if %tt% lss %total% goto begin
set "_11= 1"
for /l %%a in (1,1,%var%) do (
    for /l %%i in (1,1,%var%) do (
        set /p=!_%%a%%i! <nul
    )
    echo.
)
pause>nul
[ Last edited by bat-zw on 2008-8-27 at 02:24 PM ]
作者: bat-zw     时间: 2008-8-27 14:28
感觉解这题就整个是在变量中转圈,能否灵活运用变量是解此题的关键!
作者: slore     时间: 2008-8-27 15:40
我的代码是一直走,碰到被定义了往回退转弯。调整i,j和o确定方向。
作者: bat-zw     时间: 2008-8-27 15:50


  Quote:
Originally posted by slore at 2008-8-27 15:40:
我的代码是一直走,碰到被定义了往回退转弯。调整i,j和o确定方向。

我的代码也是一样,也是一直在调整x和y坐标的值,简单的来说是一个y+ x+ y- x-的循环。

[ Last edited by bat-zw on 2008-8-27 at 03:54 PM ]
作者: HAT     时间: 2008-8-28 15:16
贴一下我的
CODE:  [Copy to clipboard]
@echo off
setlocal enabledelayedexpansion
set /p n=What's the bands of your Spiral Matrix?[1-9]
set x=1
set u=1
set d=%n%
set l=1
set r=%n%
:begin
for /l %%i in (%l%,1,%d%) do (
  set a%u%%%i=!x!
  set /a x+=1
)
set /a ut=u+1
set /a dt=d-1
for /l %%i in (%ut%,1,%dt%) do (
  set a%%i%r%=!x!
  set /a x+=1
)
set /a lt=l+1
for /l %%i in (%r%,-1,%lt%) do (
  set a%d%%%i=!x!
  set /a x+=1
)
set /a ut=u+1
for /l %%i in (%d%,-1,%ut%) do (
  set a%%i%l%=!x!
  set /a x+=1
)
if !u! leq !d! (
  set /a u+=1
  set /a d-=1
  set /a l+=1
  set /a r-=1
  goto :begin
)
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=
)

作者: terse     时间: 2008-8-28 21:03
最后一排 漏了两字符
看到  if %p% equ 0 就可结束  更改
CODE:  [Copy to clipboard]
@echo off&setlocal enabledelayedexpansion
set/p p=输入阶数:
set/a n+=1,o=p
:lp
    set/a b+=2
    for /l %%i in (%n% 1 %p%) do set/a a+=1&set %n%%%i=!a!
    set/a n+=1
    for /l %%i in (%n% 1 %p%) do set/a a+=1&set %%i%p%=!a!
    set/a m=p-1,t+=1
    for /l %%i in (%m% -1 %t%) do set/a a+=1&set %p%%%i=!a!
    set/a p-=1,s+=1
    for /l %%i in (%p% -1 %n%) do set/a a+=1&set %%i%s%=!a!
    if %b% gtr %o% (
    for /l %%i in (1 1 %o%) do (
    for /l %%j in (1 1 %o%) do if !%%i%%j! lss 10 (set /p = !%%i%%j! <nul)else set /p =!%%i%%j! <nul
    echo.)
    pause>nul)else goto lp
[ Last edited by terse on 2008-8-29 at 02:33 AM ]
作者: HAT     时间: 2008-8-28 22:40    标题: Re 13楼

贴代码的时候漏掉了一些?

  Quote:
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\Test>test.bat
输入阶数:2
The system cannot find the batch label specified -


作者: terse     时间: 2008-8-28 23:13


  Quote:
Originally posted by HAT at 2008-8-28 22:40:
贴代码的时候漏掉了一些?

最后一排漏了字符
发了后发现和HAT兄发的差不多
作者: 523066680     时间: 2009-1-10 14:30
hat 版主玩矩阵革命呢。。。matrix
作者: netbenton     时间: 2009-1-11 02:30    标题: 我也学会了

@echo off&setlocal enabledelayedexpansion
set /p m=输入阶数(10级内):
set o=1&set k=!m!&set x=!m!&set y=1&set n=1
set /a nn=m*m+1

:loop
set yy=!k!
for /l %%a in (!o!,1,!x!) do set _!y!%%a=!n!&set /a n+=1
set xx=!o!&set y=!yy!
set /a o+=1
for /l %%a in (!o!,1,!y!) do set _%%a!x!=!n!&set /a n+=1
set yy=!o!&set x=!xx!
set /a k-=1
for /l %%a in (!k!,-1,!x!) do set _!y!%%a=!n!&set /a n+=1
set xx=!k!&set y=!yy!
for /l %%a in (!k!,-1,!y!) do set _%%a!x!=!n!&set /a n+=1
set x=!xx!
if !nn! gtr !n! goto :loop

for /l %%m in (1,1,%m%) do (
    for /l %%n in (1,1,%m%) do (
        set aaa=  !_%%m%%n!
        set aaa=!aaa:~-3!
       set /p =!aaa! <nul
     )
    echo.
)
pause>nul
作者: netbenton     时间: 2009-1-15 13:20    标题: 不限级了

::只要屏幕够显示,多少级都可以了

@echo off&setlocal enabledelayedexpansion
set /p m=输入阶数:
set o=1&set k=!m!&set x=!m!&set y=1&set n=1
set /a nn=m*m+1

:loop
set yy=!k!
for /l %%a in (!o!,1,!x!) do set _!y!b%%a=!n!&set /a n+=1
set xx=!o!&set y=!yy!
set /a o+=1
for /l %%a in (!o!,1,!y!) do set _%%ab!x!=!n!&set /a n+=1
set yy=!o!&set x=!xx!
set /a k-=1
for /l %%a in (!k!,-1,!x!) do set _!y!b%%a=!n!&set /a n+=1
set xx=!k!&set y=!yy!
for /l %%a in (!k!,-1,!y!) do set _%%ab!x!=!n!&set /a n+=1
set x=!xx!
if !nn! gtr !n! goto :loop

for /l %%m in (1,1,%m%) do (
    for /l %%n in (1,1,%m%) do (
        set aaa=  !_%%mb%%n!
        set aaa=!aaa:~-3!
       set /p =!aaa! <nul
     )
    echo.
)
pause>nul




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