标题: [已解决][难题]模拟输出数字九宫格
[打印本页]
作者: 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: |
- @echo off
- title 数字九宫格 Code By cn-dos moniuming
- Setlocal Enabledelayedexpansion
- for /l %%i in (1 1 9) do (set "bat=!bat! %%i")
- :begin
- echo.
- for /l %%i in (1 1 9) do (set "str%%i=%bat%")
- for /l %%a in (9 -1 1) do (call :loop1 %%a)
- echo.&pause&goto :begin
- :loop1
- if "%n%"=="9" (
- set "n=0"&echo %var%&set "var="
- for /l %%c in (1 1 9) do (set "%%c="&set "string%%c=")
- goto :eof
- )
- set /a "n+=1"
- for /l %%f in (1 1 9) do (
- if not defined string%%f (set "string%%f=!str%%f!")
- )
- :loop2
- set /a "ttl+=1"
- if "%ttl%"=="30" (
- set "ttl=0"&set "var="&set "n=0"
- for /l %%e in (1 1 9) do (set "%%e="&set "str%%e=!string%%e!")
- goto :loop1
- )
- set /a "mdl=%random%%%%1+1"
- for /f "tokens=%mdl%" %%d in ("!str%n%!") do (
- if defined %%d goto :loop2
- set "ttl=0"
- set "var=!var! %%d"
- set "%%d=dos"
- set "str%n%=!str%n%:%%d=!"
- )
- 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
标题: 如何用!
不知道如何用?