中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-06-19 17:54
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 出题,通过批处理输出九宫格(不限级别) 查看 1,937 回复 20
楼 主 出题,通过批处理输出九宫格(不限级别) 发表于 2008-07-16 19:29 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
18年会员
UID 112398
性别 男
状态 离线
输出如下:

┏━━┳━━┳━━┓
┃ 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
2 发表于 2008-07-16 19:50 ·  中国 江苏 苏州 常熟市 电信
高级用户
★★
五星老土
积分 558
发帖 172
注册 2003-02-09 00:00
23年会员
UID 881
性别 男
来自 江苏
状态 离线
占个沙发,第一感觉先要处理的不是批处理,而是中间的那个数字只能是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 ]
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
26933062 +15 2008-07-17 21:10
我怎么找不到一个比我注册日期早的人? 难道我是传说中的超级管理员? 其实我只是个潜水冠军而已.
3 发表于 2008-07-16 20:00 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
19年会员
UID 73968
性别 男
状态 离线
这个问题已经有过经典答案了,看谁还能有突破,也好。
看看各位的功力。。。
我是作不出,弃权。。。!
致精致简!
4 发表于 2008-07-16 20:55 ·  中国 陕西 西安 电信
铂金会员
★★★★
积分 5,212
发帖 2,478
注册 2007-02-08 23:39
19年会员
UID 79003
性别 男
状态 离线
貌似在这里有过讨论贴……

不限于3阶的。。。
S smile 微笑,L love 爱,O optimism 乐观,R relax 放松,E enthusiasm 热情...Slore
5 发表于 2008-07-16 21:06 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
18年会员
UID 112398
性别 男
状态 离线
Originally posted by quya at 2008-7-16 19:50:
占个沙发,第一感觉先要处理的不是批处理,而是中间的那个数字只能是5。

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

然后我们把左上 ...

老土的思路是对的
批处理之家新域名:www.bathome.net
6 发表于 2008-07-16 23:04 ·  中国 山东 淄博 联通
银牌会员
★★★
积分 1,604
发帖 646
注册 2008-04-13 23:39
18年会员
UID 115804
性别 男
状态 离线
头都大了。。。。前辈不妨先贴出来,一起研究。
心绪平和,眼藏静谧,无比安稳的火... Purification of soul...Just a false...^_^
7 to 6楼 发表于 2008-07-16 23:12 ·  中国 重庆 九龙坡区 电信
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
19年会员
UID 89899
性别 男
状态 离线
注意搜索,呵呵。
@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
8 发表于 2008-07-16 23:18 ·  中国 山东 淄博 联通
银牌会员
★★★
积分 1,604
发帖 646
注册 2008-04-13 23:39
18年会员
UID 115804
性别 男
状态 离线
强人。。。不过感觉变得有点体力活了。。。
心绪平和,眼藏静谧,无比安稳的火... Purification of soul...Just a false...^_^
9 发表于 2008-07-16 23:41 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
18年会员
UID 112398
性别 男
状态 离线
Originally posted by pusofalse at 2008-7-16 23:18:
强人。。。不过感觉变得有点体力活了。。。

不瞒兄弟说,我真的还没找到好的解决方法,苦思中。。。
批处理之家新域名:www.bathome.net
10 发表于 2008-07-16 23:49 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
19年会员
UID 73968
性别 男
状态 离线
如果只显示一种,按2楼的思路倒是好办,但如果要显示6种,确实有难度。。。
致精致简!
11 发表于 2008-07-17 00:19 ·  中国 江苏 苏州 常熟市 电信
高级用户
★★
五星老土
积分 558
发帖 172
注册 2003-02-09 00:00
23年会员
UID 881
性别 男
来自 江苏
状态 离线
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 ]
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
bat-zw +20 2008-07-17 17:26
我怎么找不到一个比我注册日期早的人? 难道我是传说中的超级管理员? 其实我只是个潜水冠军而已.
12 发表于 2008-07-17 00:41 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
18年会员
UID 112398
性别 男
状态 离线
本人最初的方案:

@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
13 发表于 2008-07-17 01:08 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
18年会员
UID 112398
性别 男
状态 离线
两点多了,要睡觉了,白天再来给代码减肥。

[ Last edited by zw19750516 on 2008-7-17 at 02:22 AM ]
批处理之家新域名:www.bathome.net
14 发表于 2008-07-17 01:11 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
19年会员
UID 73968
性别 男
状态 离线
按2楼的思路
这种思路如果循环最多也就显示4种,而实际有6种。


  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 ]
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
pusofalse +15 2008-07-17 04:47
致精致简!
15 发表于 2008-07-17 05:12 ·  中国 山东 淄博 联通
银牌会员
★★★
积分 1,604
发帖 646
注册 2008-04-13 23:39
18年会员
UID 115804
性别 男
状态 离线
根据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...^_^
论坛跳转: