哎,牛人就是牛人。。。。。。
果然厉害。
果然厉害。
知,不觉多。不知,乃求知
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!
Originally posted by everest79 at 2008-8-24 14:11:
希望terse讲解下算法,我没看懂
@echo off&setlocal enabledelayedexpansion
:st
rem call 9次 %1-%9 即1-9行
for /l %%i in (1 1 9) do call:lp %%i
pause&exit
:lp
rem 每行获1-9随机数
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=
rem 清空出错时返回IP标签时的%1所在行的变量
for /l %%i in (1 1 9) do set %1%%i=
rem 设定列n(起始为1) v上一行行值%1-1 y-z起始列范围值 x起始行值 变量a 判断是否1 4 7行
set var=%str%&set/a n=1,v=%1-1,y=1,z=3,x=1,a=%1%%3
rem 根据%1范围值 设定 x(行号)
if %1 geq 4 if %1 leq 6 (set/a x=4) else set/a x=7
:lp0
rem 根据变量列值n值 设定y-z列范围值
if %n% geq 4 if %n% leq 6 (set/a y=4,z=6) else set/a y=7,z=9
for %%a in (!var!) do (
rem 同行出现过 清掉返回lp0
if defined .%%a set var=!var:%%a=!&goto lp0
rem 判断%1行之前相同列是否出现过
for /l %%i in (1 1 %1) do if %%a equ !%%i%n%! set var=!var:%%a=!&goto lp0
rem 由变量a判断%1行是否1 4 7行 并判断x-v行的y-z列是否出现过
if %a% neq 1 (for /l %%j in (%x% 1 %v%) do (
for /l %%k in (%y% 1 %z%) do if %%a equ !%%j%%k! set var=!var:%%a=!&goto lp0
))
set %1!n!=%%a&set .%%a=a
rem 循环1-9列
if !n! lss 9 set/a n+=1&set var=!str:%%a=!&goto lp0
)
rem 清空变量
set str=&set n=
for /l %%i in (1 1 9) do set .%%i=
rem 判断是否的到9列 设定出错30次后 重新开始
if "!%19!"=="" set/a mn+=1&if !mn! gtr 30 (set mn=&cls&goto st)else goto lp
for /l %%i in (1 1 9) do set .%%i=&set/p=!%1%%i! <nul
echo.&set mn=
| 评分人 | 分数 | 时间 |
|---|---|---|
| everest79 | +15 | 2008-08-25 09:01 |
@echo off &setlocal enabledelayedexpansion
:test
set "numx=123456789"
set "ca=call :next"
:first
set /a ra=%random%%%9+1,rb=%random%%%9+1
set numx=!numx:%ra%=x!
set numx=!numx:%rb%=%ra%!
set numx=!numx:x=%rb%!
if %ra% neq 9 (goto :first)
set h1=%numx%
%ca% 1 2
%ca% 2 3
set h4=%h1:~2,1%%h1:~0,2%%h1:~5,1%%h1:~3,2%%h1:~8,1%%h1:~6,2%
%ca% 4 5
%ca% 5 6
set h7=%h4:~2,1%%h4:~0,2%%h4:~5,1%%h4:~3,2%%h4:~8,1%%h4:~6,2%
%ca% 7 8
%ca% 8 9
for /l %%a in (1,1,9) do (for /l %%b in (1,1,9) do (set h%%a=!h%%a:%%b=%%b !))
for /l %%a in (1,1,9) do (echo,!h%%a!)
echo, &pause &echo,
goto :test
:next
set h%2=!h%1:~3,3!!h%1:~6!!h%1:~0,3!
goto :eof