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