┏━━┳━━┳━━┓
┃ 8 ┃ 3 ┃ 4 ┃
┣━━╋━━╋━━┫
┃ 1 ┃ 5 ┃ 9 ┃
┣━━╋━━╋━━┫
┃ 6 ┃ 7 ┃ 2 ┃
┗━━┻━━┻━━┛
@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
Originally posted by quya at 2008-7-16 19:50: 占个沙发,第一感觉先要处理的不是批处理,而是中间的那个数字只能是5。 不知我的猜测是否对,有了这个基础,才能下手编。 然后我们把左上 ...老土的思路是对的
@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
Originally posted by pusofalse at 2008-7-16 23:18: 强人。。。不过感觉变得有点体力活了。。。不瞒兄弟说,我真的还没找到好的解决方法,苦思中。。。
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 ]
@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 26933062 on 2008-7-17 at 01:36 AM ]小楼一夜听春雨 2008-07-17 01:26
- @echo off
- :start
- set /a str=2468,e=5
- set /a w=%random%%%4
- call set x=%%str:~%w%,1%%
- if defined #%x% goto start
- set /a #%x%=1,a=x,nn+=1
- 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
- echo.&echo 第 %nn% 种&echo.
- echo ┏━━┳━━┳━━┓
- echo ┃ %a% ┃ %b% ┃ %c% ┃
- echo ┣━━╋━━╋━━┫
- echo ┃ %d% ┃ %e% ┃ %f% ┃
- echo ┣━━╋━━╋━━┫
- echo ┃ %g% ┃ %h% ┃ %i% ┃
- echo ┗━━┻━━┻━━┛
- pause>nul&cls
- if %nn% equ 4 echo.&echo 再也显示不出来了
- goto start
@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
小楼一夜听春雨 2008-07-17 11:26
- @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
@echo off
:start
set /a num=%random%%%8
set /a num1=%num%%%2
if %num1%==0 (set str=14789632) else (set str=23698741)
call set "str=%%str:~%num%%%%%str:~0,%num%%%"
for /l %%i in (0,1,7) do call set n%%i=%%str:~%%i,1%%
echo %n1% %n6% %n3%
echo %n4% 5 %n0%
echo %n7% %n2% %n5%
echo.
pause
goto :start
@echo off&setlocal enabledelayedexpansion
:begin
for /l %%i in (1,1,9) do set "_%%i="
set "_5=5"&set "code=12346789"&set /a v=8,n=1
:again
if defined _%n% goto next
set /a a=%random%%%%v%
set "a=!code:~%a%,1!"
set /a m=n%%2,as=a%%2
if %m% equ %as% goto again
set "_%n%=%a%"&set /a b=10-a,c=10-n
set "code=!code:%a%=!"&set "code=!code:%b%=!"&set "_%c%=%b%"&set /a v-=2
:next
set /a n+=1&if !n! neq 5 goto again
set /a num1=_1+_2+_3,num2=_1+_4+_7
for %%i in (1 2) do if !num%%i! neq 15 goto begin
for /l %%i in (1,1,9) do set str=!str!!_%%i!
if defined _%str% (set "str="&goto begin) else (set "_%str%=%str%"&set /a num+=1)
cls&echo.&echo 第%num%种&echo.
set n=0&echo ┏━━┳━━┳━━┓
for /l %%i in (1,1,9) do (set /a n+=1
set /p=┃ !_%%i! <nul
if !n! equ 3 (
set "n=0"&set /p=┃<nul&echo.
if %%i neq 9 (
echo ┣━━╋━━╋━━┫
) else (
echo ┗━━┻━━┻━━┛
)))
if %num% neq 8 ping /n 3 127.1>nul&goto begin
pause>nul
Originally posted by 26933062 at 2008-7-17 11:37: 确实是有 8 种, 原来如此简单,交换一下位置就可以了。。现在仔细看了小楼兄的代码才知道自己想复杂了,看来老土的思路是完全正确的,确实刚开始写之前多思考下就不至于走那么大的弯路了。
但最值得一提的还是quya老土的解题思路,思路对才能正确解决问题, 这也是我所一直以来信奉的原则,所以我给老土加了满分20分。非常同意楼主的这个观点,解题思路是首位、代码技巧其次。 一开始看到这个题,我都不知道从哪里下手,本决定放弃解此题的,所以有了3楼的回帖,(2楼的解题思路是后来补上去的)但一看到2楼的思路,茅塞顿开。。。