Board logo

标题: [已解决][难题]模拟输出数字九宫格 [打印本页]

作者: moniuming     时间: 2008-8-9 15:50    标题: [已解决][难题]模拟输出数字九宫格

模拟输出数字九宫格游戏(每行和每列的数字都不重复,而且是乱序),弄了三天都没弄出来,希望各位帮帮忙,就当是一个练习吧.
示例中只有1~6,希望能给出1~9的(能随机将每行中的几个数字变成空格就更好了).谢谢!!!

  Quote:

1 2 5 3 6 4
5 4 3 1 2 6
3 5 2 6 4 1
2 3 6 4 1 5
6 1 4 2 5 3
4 6 1 5 3 2

由于昨天没把问题描述清楚,现在再重新梳理一下,就是乱序生成9*9的数列,每行和每列都必须包含1~9这9个数字,如下:
8 7 5 2 9 1 6 4 3
2 9 6 4 3 8 5 1 7
3 4 1 7 6 5 2 8 9
6 5 9 1 7 3 4 2 8
4 2 7 9 8 6 1 3 5
1 3 8 6 5 2 7 9 4
9 8 4 5 1 7 3 6 2
7 1 2 3 4 9 8 5 6
5 6 3 8 2 4 9 7 1

7 6 3 2 1 5 9 8 4
9 5 2 6 8 4 3 1 7
8 4 1 3 9 7 6 5 2
2 1 5 4 6 9 8 7 3
4 9 6 8 7 3 1 2 5
1 3 8 5 4 2 7 9 6
3 2 7 9 5 8 4 6 1
6 8 4 7 2 1 5 3 9
5 7 9 1 3 6 2 4 8

4 6 9 1 3 2 8 5 7
5 1 3 7 4 8 2 9 6
6 2 8 5 7 9 1 4 3
9 4 5 3 2 7 6 1 8
8 7 6 2 1 5 4 3 9
1 3 2 4 8 6 9 7 5
3 8 7 6 9 4 5 2 1
7 5 4 9 6 1 3 8 2
2 9 1 8 5 3 7 6 4
2楼和5楼的是有规律的,不符合要求.

比较好的代码有:
22楼本人的代码(效率较低)
27楼terse的代码(效率较低)
29楼52306668的代码(效率较高,有规律)
31楼52306668的代码(效率较高,感觉最满意)


[ Last edited by moniuming on 2008-8-18 at 12:02 PM ]
作者: pusofalse     时间: 2008-8-9 16:44
1 2 3 4 5 6
2 3 4 5 6 1
3 4 5 6 1 2
4 5 6 1 2 3
5 6 1 2 3 4
6 1 2 3 4 5

这样可以吗?
作者: bat-zw     时间: 2008-8-9 16:55
能随机将每行中的几个数字变成空格就更好了
这是什么意思。。。
ps:要达到楼主其他的要求不难。。
作者: moniuming     时间: 2008-8-9 17:04
每次都生成不一样的,要随机生成,如下(把1做成2的效果):
1:

  Quote:
3 5 8 4 7 9 1 6 2
2 6 4 3 1 5 8 9 7
9 1 7 8 6 2 4 5 3
1 4 5 2 3 7 6 8 9
8 2 6 5 9 1 7 3 4
7 9 3 6 8 4 5 2 1
4 8 9 7 2 6 3 1 5
6 7 2 1 5 3 9 4 8
5 3 1 9 4 8 2 7 6

2:

  Quote:
3 _ _ _ 7 9 _ 6 2
2 _ _ _ 1 _ 8 9 7
_ 1 7 8 _ _ 4 5 3
_ 4 _ _ 3 7 _ _ _
_ 2 _ 5 _ 1 7 3 4
7 _ 3 _ 8 _ _ 2 1
4 _ 9 _ 2 6 3 _ _
6 7 _ _ 5 _ 9 _ 8
_ _ _ 9 4 8 2 7 _

[ Last edited by moniuming on 2008-8-10 at 09:29 AM ]
作者: bat-zw     时间: 2008-8-9 17:08

@echo off&setlocal enabledelayedexpansion
set "code= 9 1 2 3 4 5 6 7 8"
for /l %%i in (1,1,9) do (
    set "a=!code:~1,1!"
    set "code=!code:~2! !a!"
    echo !code:~1!
)
pause>nul
ps:这是不是每行每列都不一样啊

[ Last edited by bat-zw on 2008-8-9 at 05:09 PM ]
作者: pusofalse     时间: 2008-8-9 17:15
随机乱序啊。每个数字都用到了,如果用不到那才难。
作者: slore     时间: 2008-8-9 17:34
数独???
作者: moniuming     时间: 2008-8-9 17:38


  Quote:
Originally posted by slore at 2008-8-9 17:34:
数独???

是啊,因为数独是日本人的叫法,我非常讨厌日本人,所以就用中国人的叫法啦
作者: moniuming     时间: 2008-8-9 17:48    标题: 这样就行了

_ _ 5 2 9 _ 6 _ _
_ 9 _ _ _ 8 _ 1 7
3 4 _ _ 6 _ 2 _ _
_ _ 9 1 7 3 4 _ _
4 _ _ _ 8 _ _ _ 5
1 _ 8 _ _ _ 7 9 _
_ _ 4 5 _ _ 3 _ _
7 _ 2 3 _ _ _ 5 6
_ 6 _ 8 2 _ _ _ 1
作者: moniuming     时间: 2008-8-10 09:45
要求已在顶楼更新
继续期待中......
作者: pusofalse     时间: 2008-8-10 12:36
你那几个样本是怎样生成的?~^_^
作者: pusofalse     时间: 2008-8-10 12:50
理论上来说是可以的。但成功率。。。。。9*9没成功过。
@echo off&setlocal enabledelayedexpansion
for /l %%a in (0 1 6) do set var%%a=123456
set/a s=6,z=s
:loop
:: set m=%random%
set/a n+=1,m=%random%%%%s%
set a=!var%n%:~%m%,1!
if defined #%a% set/a n-=1&goto loop
set #%a%=abc
set var%n%=!var%n%:%a%=!
set "str=%str%%a% "
if %n% neq 6 goto loop
echo %str%
for /f "delims==" %%a in ('set #') do set "%%a="
set "str="
set/a s-=1
set/a n=0
if %s% neq 0 goto loop
pause

作者: moniuming     时间: 2008-8-10 13:16


  Quote:
Originally posted by pusofalse at 2008-8-10 12:36:
你那几个样本是怎样生成的?~^_^

哈哈,有一个游戏软件(exel格式)

12楼的代码在输出2行后就没了,但内存还是100%,
附件 1: 九宫格数字游戏.rar (2008-8-10 13:16, 45.53 K, 下载附件所需积分 1点 ,下载次数: 5)

作者: pusofalse     时间: 2008-8-10 13:33
我测试输出5个,成功率就已经非常低了,就更别说5个以上了。
就连3个时也有出错。 正在研究新方案。这类的题好复杂啊,看来我昨天太简单化了。
作者: flyinspace     时间: 2008-8-10 14:00
呵呵这样的题目要有算法才好做。
要不好麻烦的。我情愿用c去写出来。还会简单一些。
作者: terse     时间: 2008-8-10 17:16
先抛个砖  成功率太低  那位继续
@echo off&setlocal enabledelayedexpansion
for /l %%i in (1 1 9) do call:lp %%i
pause&goto :eof
:lp
set/a var=!random!%%9+1
if defined .!var! (goto lp)else set/a n+=1&set str=!var! !str!&set .!var!=a
   if !n! lss 9 goto lp
   for /l %%i in (1 1 9) do set .%%i=
   set var=%str%&set n=1
:lp0
for %%a in (!var!) do (
if defined .%%a set var=!var:%%a=!&goto lp0
  for /l %%i in (1 1 %1) do if %%a equ !%%i%n%! set var=!var:%%a=!&goto lp0
     set %1!n!=%%a&set .%%a=ok
        if !n! lss 9 set/a n+=1&set var=!str:%%a=!&goto lp0
       )
        set str=&set n=
for /l %%i in (1 1 9) do set .%%i=
for /l %%i in (9 -1 1) do if "!%1%%i!"=="" set str=&set n=&goto lp
for /l %%i in (1 1 9) do set .%%i=&set/p=!%1%%i! <nul
echo.
[ Last edited by terse on 2008-8-10 at 05:23 PM ]
作者: obsolete     时间: 2008-8-10 20:23
先生成一个规则的矩阵,然后交替进行行列交换,应该可以达到随机效果
作者: obsolete     时间: 2008-8-10 20:32
感觉很像之前d一个老大出的乱序产生0-99数字的二维版,相关的算法应该都可以借鉴
作者: 523066680     时间: 2008-8-10 22:20
问:对角斜线中的数字是否能出现相同数字
作者: 523066680     时间: 2008-8-11 10:19
弄了一个7*7的……改成9*9 的弄到一半就就停了……
@echo off
setlocal enabledelayedexpansion
set a=0
for %%a in (1 2 3 4 5 6 7) do (set n%%a=%%a)
set /a n0=1,n8=2,n9=3
:a
set /a a+=1,b=0
md TheTest\hang%a%
   :b
   set /a b+=1
   if not exist TheTest\Lie%b% (md TheTest\Lie%b%)
            :b-1
             set num=!n%random:~1,1%!
             if exist TheTest\Hang%a%\!num! (goto :b-1)
             if exist TheTest\Lie%b%\!num! (goto :b-1)
             md TheTest\Hang%a%\!num!
             md TheTest\Lie%b%\!num!
             set h%a%=!num! !h%a%!
    if %b% equ 7 (goto :b-end) else (goto :b)
:b-end
if %a% equ 7 (goto :end) else (goto :a)
:end
for /l %%a in (1,1,9) do echo,!h%%a!
pause>nul
--------------……这代码不好……

[ Last edited by 523066680 on 2008-8-16 at 05:56 PM ]
作者: obsolete     时间: 2008-8-11 13:16
想太简单了,撤回17-18楼,
看各位老大解题
作者: moniuming     时间: 2008-8-11 13:50    标题: 为我欢呼吧,哈哈...

努力想啊想的,终于给我弄出来了,头发白了不少^_^,最主要是在出现死循环的时候如何重置.
乘着奥运的热风,让我满足一下一点点虚荣心吧.

  Quote:

  1. @echo off
  2. title 数字九宫格 Code By cn-dos moniuming
  3. Setlocal Enabledelayedexpansion
  4. for /l %%i in (1 1 9) do (set "bat=!bat! %%i")
  5. :begin
  6. echo.
  7. for /l %%i in (1 1 9) do (set "str%%i=%bat%")
  8. for /l %%a in (9 -1 1) do (call :loop1 %%a)
  9. echo.&pause&goto :begin
  10. :loop1
  11. if "%n%"=="9" (
  12.    set "n=0"&echo %var%&set "var="
  13.    for /l %%c in (1 1 9) do (set "%%c="&set "string%%c=")
  14.    goto :eof
  15. )
  16. set /a "n+=1"
  17. for /l %%f in (1 1 9) do (
  18.    if not defined string%%f (set "string%%f=!str%%f!")
  19. )
  20. :loop2
  21. set /a "ttl+=1"
  22. if "%ttl%"=="30" (
  23.    set "ttl=0"&set "var="&set "n=0"
  24.    for /l %%e in (1 1 9) do (set "%%e="&set "str%%e=!string%%e!")
  25.    goto :loop1
  26. )
  27. set /a "mdl=%random%%%%1+1"
  28. for /f "tokens=%mdl%" %%d in ("!str%n%!") do (
  29.    if defined %%d goto :loop2
  30.    set "ttl=0"
  31.    set "var=!var! %%d"
  32.    set "%%d=dos"
  33.    set "str%n%=!str%n%:%%d=!"
  34. )
  35. goto :loop1
        moniuming发表于:  2008-08-11  13:31


作者: 523066680     时间: 2008-8-11 14:06
哇 还是穷举的!强!
作者: moniuming     时间: 2008-8-11 14:20


  Quote:
Originally posted by 523066680 at 2008-8-11 14:06:
哇 还是穷举的!强!

这个可不是穷举的,呵呵,不过也差不多了,汗...
作者: pusofalse     时间: 2008-8-11 14:26
穷举吧。。那个ttl=30
但依然精彩,学习了!
作者: moniuming     时间: 2008-8-11 14:30


  Quote:
Originally posted by pusofalse at 2008-8-11 14:26:
穷举吧。。那个ttl=30
但依然精彩,学习了!

ttl=30是指每一位数字的计算次数限制在30次以内,如果超过的话就重置
其实取值范围是在已经出现的数字以外取的,并不是穷举
作者: terse     时间: 2008-8-14 19:28
修正16楼的
@echo off&setlocal enabledelayedexpansion
for /l %%i in (1 1 9) do call:lp %%i
pause&exit
:lp
for /l %%i in (1 1 9) do set .!random!!random!!random!=%%i
   for /f "tokens=1,2 delims==" %%i in ('set .') do set str=%%j !str!&set %%i=
      for /l %%i in (1 1 9) do set %1%%i=
      set var=%str%&set n=1
:lp0
for %%a in (!var!) do (
if defined .%%a set var=!var:%%a=!&goto lp0
  for /l %%i in (1 1 %1) do if %%a equ !%%i%n%! set var=!var:%%a=!&goto lp0
     set %1!n!=%%a&set .%%a=ok
        if !n! lss 9 set/a n+=1&set var=!str:%%a=!&goto lp0
       )
        set str=&set n=
        for /l %%i in (1 1 9) do set .%%i=
        if "!%19!"=="" goto lp
        for /l %%i in (1 1 9) do set .%%i=&set/p=!%1%%i! <nul
echo.

作者: moniuming     时间: 2008-8-15 11:55    标题: 精彩!!!

好东西
学习了......
作者: 523066680     时间: 2008-8-16 18:07
我觉得17楼的方法可行 而且效率很高 看代码

  Quote:
Originally posted by obsolete at 2008-8-10 08:23 PM:
先生成一个规则的矩阵,然后交替进行行列交换,应该可以达到随机效果


@echo off
setlocal enabledelayedexpansion
set h1=123456789
set h2=234567891
set h3=345678912
set h4=456789123
set h5=567891234
set h6=678912345
set h7=789123456
set h8=891234567
set h9=912345678
:a
set /a a=0,b=0
  :b
  set /a a+=1
     :b1
     set n=%random:~-1%
     if %n% equ 9 set n=8
     if not defined Ex%n% (
     for /l %%a in (1,1,9) do (call,set hang%%a=!hang%%a! %%h%%a:~!n!,1%%)
     ) else (goto :b1)
  set Ex%n%=ex
  if %a% lss 9 goto :b
  :c
    set /a b+=1
     :c1
     set n=%random:~-1%
     if %n% equ 0 set n=9
     if not defined Ex2%n% (echo !hang%n%!) else (goto :c1)
  set Ex2%n%=ex
  if %b% lss 9 goto :c
pause
for /l %%a in (0,1,9) do (
set Ex%%a=
set Ex2%%a=
set hang%%a=
)
goto :a
[ Last edited by 523066680 on 2008-8-16 at 08:09 PM ]
作者: moniuming     时间: 2008-8-17 13:43    标题: 精彩!!!

真高兴有那么精彩的代码,不过很可惜的是29楼的代码有规律可循,不能在九宫格游戏中运用,否则解题将不会有任何难度.
作者: 523066680     时间: 2008-8-17 21:46
哈哈,坚持把这个思路完善,横竖乱序后,再随机调换数字:
@echo off
title made by cn-dos and bathome - 523066680
setlocal enabledelayedexpansion
:start
set h1=123456789
set h2=234567891
set h3=345678912
set h4=456789123
set h5=567891234
set h6=678912345
set h7=789123456
set h8=891234567
set h9=912345678

for /l %%a in (0,1,9) do (
set Ex%%a=
set Ex2%%a=
set hang%%a=
)

set /a a=0,b=0,c=0
::a ---把列打乱
  :a
  set /a a+=1
     :a-1
     set n=%random:~-1%
     if %n% equ 9 set n=8
     if not defined Ex%n% (
     for /l %%a in (1,1,9) do (call,set hang%%a=!hang%%a! %%h%%a:~!n!,1%%)
     ) else (goto :a-1)
  set Ex%n%=ex
  if %a% lss 9 goto :a
::b ---把行打乱
  :b
    set /a b+=1
     :b-1
     set n=%random:~-1%
     if %n% equ 0 set n=9
     if not defined Ex2%n% (set h%b%=!hang%n%!) else (goto :b-1)
  set Ex2%n%=ex
  if %b% lss 9 goto :b
::c ---随机调换数字
  :c
    set /a c+=1
     :c-1
     set n1=!random:~-1!
     set n2=!random:~-1!
     if %n1% equ %n2% goto :c-1
     if %n1% equ 0 set n1=1
     if %n2% equ 0 set n2=9
     for /l %%a in (1,1,9) do (
           set h%%a=!h%%a:%n1%=n!
           set h%%a=!h%%a:%n2%=%n1%!
           set h%%a=!h%%a:n=%n2%!
           )
     if %c% lss 8 goto :c
for /l %%a in (1,1,9) do echo !h%%a!
pause
goto :start
[ Last edited by 523066680 on 2008-8-18 at 07:42 AM ]
作者: moniuming     时间: 2008-8-17 23:18    标题: 31楼,好样的!!!

哈哈,看来要用31楼的代码来做数字九宫格游戏的主体了...
作者: flyinspace     时间: 2008-8-18 02:18
这个?有解决么?

没有发现啊 ?

5 6 4 7 3 9 8 2 1
1 4 2 9 5 8 7 6 3
4 9 8 5 6 1 3 7 2
3 2 6 8 1 7 9 4 5
2 8 7 1 4 3 5 9 6
6 7 9 3 2 5 1 8 4
7 3 5 2 8 6 4 1 9
9 5 1 6 7 4 2 3 8
8 1 3 4 9 2 6 5 7

根本没有解决哦。。

看到了蓝色的字没?不符合条件的。

[ Last edited by flyinspace on 2008-8-18 at 02:19 AM ]
作者: 523066680     时间: 2008-8-18 06:24
真麻烦呐……对于这个我还是不了解……不干了……

额 好像这种情况是挺多的,看看能不能改改咯……

现在已经将31楼调换数字次数改成8次.试试
多少还是出现了多处类似的情况……&麻烦呐
5 6 8 9 3 7 2 1 4
6 1 3 4 5 2 8 9 7
3 5 2 1 8 4 7 6 9
4 7 1 8 9 5 6 2 3
7 2 9 3 4 6 1 8 5
2 8 4 5 7 1 9 3 6
8 3 7 6 2 9 4 5 1
9 4 6 2 1 3 5 7 8
1 9 5 7 6 8 3 4 2



刚刚观察,moun的生成结果,偶然的也会出现类似情况啊
5 7 2 3 9 6 4 8 1
2 9 1 6 5 3 7 4 8
7 6 8 5 4 1 2 3 9
1 4 6 8 7 9 5 2 3
6 3 4 2 8 7 1 9 5
8 5 9 1 6 4 3 7 2
3 8 7 9 2 5 6 1 4
4 2 3 7 1 8 9 5 6
9 1 5 4 3 2 8 6 7


细心看了n个代码的结果,应该说 这个情况不在少数。
我把31楼关键部分改了下。稍微减少了相邻相同的现象
(才发现原来的时候 好多地方都是相邻相等啊)

[ Last edited by 523066680 on 2008-8-18 at 08:23 AM ]
作者: moniuming     时间: 2008-8-18 11:54


  Quote:
Originally posted by flyinspace at 2008-8-18 02:18:
这个?有解决么?

没有发现啊 ?

5 6 4 7 3 9 8 2 1
1 4 2 9 5 8 7 6 3
4[/c ...

个人认为要排除这种情况是非常困难的,13楼的游戏软件也会出现这种情况呀...
作者: ziyouren18     时间: 2008-9-8 16:51    标题: 如何用!

不知道如何用?