中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 出题,通过批处理输出九宫格(不限级别)
« [1] [2] »
作者:
标题: 出题,通过批处理输出九宫格(不限级别) 上一主题 | 下一主题
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『楼 主』:  出题,通过批处理输出九宫格(不限级别)

输出如下:
┏━━┳━━┳━━┓
┃ 8  ┃ 3  ┃ 4  ┃
┣━━╋━━╋━━┫
┃ 1  ┃ 5  ┃ 9  ┃
┣━━╋━━╋━━┫
┃ 6  ┃ 7  ┃ 2  ┃
┗━━┻━━┻━━┛
要求:里面的数字是随机生成的,任意三个连着的数之和为15(横加、竖加、斜
加)。

----------------------------------------------------------------------------------------------------------
目前最完美的答案是小楼兄写出来的,代码确实精练,所以加6分:
@echo off&color 1f
:start
set /a str=2468,e=5,flag=0
set /a w=%random%%%4
call set x=%%str:~%w%,1%%
if defined #%x% goto start
set /a #%x%=1,a=x
call set str=%%str:%a%=%%
set /a i=15-e-a
call set str=%%str:%i%=%%
set /a w=%random%%%2
call set c=%%str:~%w%,1%%
call set str=%%str:%c%=%%
set /a b=15-a-c,d=15-str-a,f=15-d-e,g=str,h=15-g-i
:loop
set /a nn+=1
echo.&echo  第 %nn% 种&echo.
echo ┏━━┳━━┳━━┓
echo ┃ %a%  ┃ %b%  ┃ %c%  ┃
echo ┣━━╋━━╋━━┫
echo ┃ %d%  ┃ %e%  ┃ %f%  ┃
echo ┣━━╋━━╋━━┫
echo ┃ %g%  ┃ %h%  ┃ %i%  ┃
echo ┗━━┻━━┻━━┛
pause>nul&cls
if %flag% equ 0 (
set b=%d%&set d=%b%&set g=%c%&set c=%g%&set h=%f%&set f=%h%&set flag=1&goto loop
)
if %nn% neq 8 goto start
echo.&echo  总共 %nn% 种
pause>nul
----------------------------------------------------------------------------------------------------------
但最值得一提的还是quya老土的解题思路,思路对才能正确解决问题,这也是我
所一直以来信奉的原则,所以我给老土加了满分20分。
----------------------------------------------------------------------------------------------------------
至此,我们通过重解此题有了最大的收获:一个人不仅要敢于挑战自己,更要勇
于挑战经典(老土的思路+小楼兄的代码已经超越了前版主namejm的经典方案)。
----------------------------------------------------------------------------------------------------------


[ Last edited by zw19750516 on 2008-7-17 at 05:41 PM ]



批处理之家新域名:www.bathome.net
2008-7-16 19:29
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
quya
高级用户

五星老土


积分 558
发帖 172
注册 2003-2-9
来自 江苏
状态 离线
『第 2 楼』:  

占个沙发,第一感觉先要处理的不是批处理,而是中间的那个数字只能是5。

不知我的猜测是否对,有了这个基础,才能下手编。

然后我们把左上第一格取个随机数a1,这个数一定是小于等于8的偶数,然后它的对角线上的数字a9一定是10-a1.

再在剩余的角上 a3 或者 a7 任取一个余下的偶数,最后一个角的偶数也定了。

奇数则分布在 a2, a4, a6, a8上, 4个偶数定了以后,奇数也就定了。

整个程序要用到2次随机数。

我们的思路也可以这样简化, 第一次产生一个不等于5,而且小于9的任意数,如果是偶数,则赋值给a1,否则赋值给a2.

[ Last edited by quya on 2008-7-16 at 08:48 PM ]

   此帖被 +15 点积分         点击查看详情   
评分人:【 26933062 分数: +15  时间:2008-7-17 21:10




我怎么找不到一个比我注册日期早的人? 难道我是传说中的超级管理员? 其实我只是个潜水冠军而已.
2008-7-16 19:50
查看资料  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 3 楼』:  

这个问题已经有过经典答案了,看谁还能有突破,也好。
看看各位的功力。。。
我是作不出,弃权。。。!



致精致简!
2008-7-16 20:00
查看资料  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 4 楼』:  

貌似在这里有过讨论贴……

不限于3阶的。。。



S smile 微笑,L love 爱,O optimism 乐观,R relax 放松,E enthusiasm 热情...Slore
2008-7-16 20:55
查看资料  发短消息 网志   编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 5 楼』:  



  Quote:
Originally posted by quya at 2008-7-16 19:50:
占个沙发,第一感觉先要处理的不是批处理,而是中间的那个数字只能是5。

不知我的猜测是否对,有了这个基础,才能下手编。

然后我们把左上 ...

老土的思路是对的



批处理之家新域名:www.bathome.net
2008-7-16 21:06
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
pusofalse
银牌会员




积分 1604
发帖 646
注册 2008-4-13
状态 离线
『第 6 楼』:  

头都大了。。。。前辈不妨先贴出来,一起研究。



心绪平和,眼藏静谧,无比安稳的火... Purification of soul...Just a false...^_^
2008-7-16 23:04
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 7 楼』:  to 6楼

注意搜索,呵呵。
@echo off
title 九宫格
mode con cols=40 lines=20
set n1=0
setlocal enabledelayedexpansion

:begin
cls
set n5=5
set str= 1 2 3 4 6 7 8 9
set /a n1+=1
if %n1% gtr 9 exit
call :intercept %n1%
set /a n9=15-%n1%-%n5%
call :intercept %n9%
for %%i in (%str%) do (
    set flag=
    set n2=%%i
    set str_tmp=%str%
    call :intercept !n2!
    set /a n8=15-!n2!-!n5!
    set /a n3=15-!n1!-!n2!
    set /a n7=15-!n8!-!n9!
    set /a n4=15-!n1!-!n7!
    set /a n6=15-!n3!-!n9!
    for %%j in (!n3! !n4! !n6! !n7! !n8!) do call :intercept %%j
    if not "!str!"=="" set flag=1
    set /a sum1=!n3!+!n5!+!n7!
    set /a sum2=!n4!+!n5!+!n6!
    if !sum1! equ 15 if !sum1! equ !sum2! if not defined flag call :result
    set str=!str_tmp!
)
goto begin

:intercept
set str=!str: %1=!
goto :eof

:result
cls
echo.
echo.
echo.
echo            ┌──┬──┬──┐
echo            │ %n1%  │ %n2%  │ %n3%  │
echo            ├──┼──┼──┤
echo            │ %n4%  │ %n5%  │ %n6%  │
echo            ├──┼──┼──┤
echo            │ %n7%  │ %n8%  │ %n9%  │
echo            └──┴──┴──┘
echo.
echo ________________________________________
echo.
echo             按任意键显示下一个
pause>nul
goto :eof




2008-7-16 23:12
查看资料  发短消息 网志   编辑帖子  回复  引用回复
pusofalse
银牌会员




积分 1604
发帖 646
注册 2008-4-13
状态 离线
『第 8 楼』:  

强人。。。不过感觉变得有点体力活了。。。



心绪平和,眼藏静谧,无比安稳的火... Purification of soul...Just a false...^_^
2008-7-16 23:18
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 9 楼』:  



  Quote:
Originally posted by pusofalse at 2008-7-16 23:18:
强人。。。不过感觉变得有点体力活了。。。

不瞒兄弟说,我真的还没找到好的解决方法,苦思中。。。



批处理之家新域名:www.bathome.net
2008-7-16 23:41
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 10 楼』:  

如果只显示一种,按2楼的思路倒是好办,但如果要显示6种,确实有难度。。。



致精致简!
2008-7-16 23:49
查看资料  发短消息 网志   编辑帖子  回复  引用回复
quya
高级用户

五星老土


积分 558
发帖 172
注册 2003-2-9
来自 江苏
状态 离线
『第 11 楼』:  



  Quote:
Originally posted by 26933062 at 2008-7-16 11:49 PM:
如果只显示一种,按2楼的思路倒是好办,但如果要显示6种,确实有难度。。。

按我的办法只要重复调用完全可以随机显示所有可能。

这个题目不难的, 难就难在N宫的问题。

实际上这只是3宫,并非9宫, 真正9宫是81格。其实5宫就有点难度了。

以奇数宫为例:

中间的数字是固定的,等于 (n*n+1)/2

4个角上的数字也是固定的,但可以轮换,分别是

(n*n+n)/2
(n*n-n+2)/2
(n*n+n+4)/2
(n*n-n-2)/2


假如代入楼主的3宫题,那么4个角上的数字分别为 6,4,8,2

4条边的中间数字分别是1, (n+3)/2, n*n, (n*n+1)-(n+3)/2, 其他规律大家可以推算一下, 反正是很复杂的。

如果是偶数宫, 情况又会不一样。

[ Last edited by quya on 2008-7-17 at 01:04 AM ]

   此帖被 +20 点积分         点击查看详情   
评分人:【 bat-zw 分数: +20  时间:2008-7-17 17:26




我怎么找不到一个比我注册日期早的人? 难道我是传说中的超级管理员? 其实我只是个潜水冠军而已.
2008-7-17 00:19
查看资料  发短消息 网志   编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 12 楼』:  

本人最初的方案:
@echo off&setlocal enabledelayedexpansion
:begin
for /l %%a in (1,1,3) do for /l %%i in (1,1,3) do set "_%%a%%i="
set "_22=5"&set "code=12346789"&set /a v=8,n=0,m=0
:again
set /a n+=1,m=1
:lp
if defined _%n%%m% goto next
set /a a=%random%%%%v%
set "a=!code:~%a%,1!"
set /a num=(n+m)%%2,as=a%%2
if %num% neq %as% goto lp
set "_%n%%m%=%a%"&set /a b=10-a,c=4-n,d=4-m
set "code=!code:%a%=!"
set "code=!code:%b%=!"&set /a v-=2
for %%i in (11 13 31 33) do if %n%%m% equ %%i set "_%c%%d%=%b%"
for %%i in (12 32) do if %n%%m% equ %%i set "_%c%%m%=%b%"
for %%i in (21 23) do if %n%%m% equ %%i set "_%n%%d%=%b%"
:next
set /a m+=1
if %m% neq 4 goto lp
if %n% neq 3 goto again
set /a num1=_11+_12+_13,num2=_11+_21+_31,num3=_31+_32+_33,num4=_13+_23+_33
for /l %%i in (1,1,4) do if !num%%i! neq 15 goto begin
echo ┏━━┳━━┳━━┓
for /l %%a in (1,1,3) do (
    for /l %%i in (1,1,4) do set /p=┃!_%%a%%i!   <nul
    echo.
    if %%a neq 3 (
       echo ┣━━╋━━╋━━┫
       ) else (      
       echo ┗━━┻━━┻━━┛
))
pause>nul&goto :eof
[ Last edited by zw19750516 on 2008-7-17 at 05:42 PM ]



批处理之家新域名:www.bathome.net
2008-7-17 00:41
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 13 楼』:  

两点多了,要睡觉了,白天再来给代码减肥。

[ Last edited by zw19750516 on 2008-7-17 at 02:22 AM ]



批处理之家新域名:www.bathome.net
2008-7-17 01:08
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 14 楼』:  

按2楼的思路
这种思路如果循环最多也就显示4种,而实际有6种。

  Quote:

  1. @echo off
  2. :start
  3. set /a str=2468,e=5
  4. set /a w=%random%%%4
  5. call set x=%%str:~%w%,1%%
  6. if defined #%x% goto start
  7. set /a #%x%=1,a=x,nn+=1
  8. call set str=%%str:%a%=%%
  9. set /a i=15-e-a
  10. call set str=%%str:%i%=%%
  11. set /a w=%random%%%2
  12. call set c=%%str:~%w%,1%%
  13. call set str=%%str:%c%=%%
  14. set /a b=15-a-c,d=15-str-a,f=15-d-e,g=str,h=15-g-i
  15. echo.&echo  第 %nn% 种&echo.
  16. echo ┏━━┳━━┳━━┓
  17. echo%a%  ┃ %b%  ┃ %c%  ┃
  18. echo ┣━━╋━━╋━━┫
  19. echo%d%  ┃ %e%  ┃ %f%  ┃
  20. echo ┣━━╋━━╋━━┫
  21. echo%g%  ┃ %h%  ┃ %i%  ┃
  22. echo ┗━━┻━━┻━━┛
  23. pause>nul&cls
  24. if %nn% equ 4 echo.&echo  再也显示不出来了
  25. goto start
                小楼一夜听春雨  2008-07-17  01:26

[ Last edited by 26933062 on 2008-7-17 at 01:36 AM ]

   此帖被 +15 点积分         点击查看详情   
评分人:【 pusofalse 分数: +15  时间:2008-7-17 04:47




致精致简!
2008-7-17 01:11
查看资料  发短消息 网志   编辑帖子  回复  引用回复
pusofalse
银牌会员




积分 1604
发帖 646
注册 2008-4-13
状态 离线
『第 15 楼』:  

根据26933062前辈的代码稍微添加了几句,8种布局能全部能显示出来。。。只有8种?或更多?
@echo off&setlocal enabledelayedexpansion
:begin
set/a str=2468,e=5
set/a n=%random%%%4
if defined #%n% goto begin
set/a #%n%=1,nn+=1
set a=!str:~%n%,1!
set str=!str:%a%=!
set/a i=15-a-e
set str=!str:%i%=!
set/a n=%random%%%2
set c=!str:~%n%,1!
set str=!str:%c%=!
set g=%str%
set/a b=15-a-c,d=15-a-g,f=15-d-e,h=15-g-i
echo.&echo  第 %nn% 种&echo.
echo ┏━━┳━━┳━━┓
echo ┃ %a%  ┃ %b%  ┃ %c%  ┃
echo ┣━━╋━━╋━━┫
echo ┃ %d%  ┃ %e%  ┃ %f%  ┃
echo ┣━━╋━━╋━━┫
echo ┃ %g%  ┃ %h%  ┃ %i%  ┃
echo ┗━━┻━━┻━━┛
pause>nul
set/a nn+=1&call :lp
if %nn% neq 8 goto begin
exit/b

:lp
echo.&echo  第 %nn% 种&echo.
echo ┏━━┳━━┳━━┓
echo ┃ %a%  ┃ %d%  ┃ %g%  ┃
echo ┣━━╋━━╋━━┫
echo ┃ %b%  ┃ %e%  ┃ %h%  ┃
echo ┣━━╋━━╋━━┫
echo ┃ %c%  ┃ %f%  ┃ %i%  ┃
echo ┗━━┻━━┻━━┛
pause>nul




心绪平和,眼藏静谧,无比安稳的火... Purification of soul...Just a false...^_^
2008-7-17 05:12
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: