
标题: [出题]批处理趣味数学之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 |