正要说这个, 用换班的方法会造成矛盾,
设换班号之前两个后门生其中一个在 M 班, 要去 P 班
而另一个在 N 班, 要去 Q 班
就存在两次班号调换, M<==>P, N<==>Q
这样, 当 M, N, P, Q 这四个数字中有相同, 但又不是 M=Q且P=N的情况, 就会至少使一个后门生到不了要去的班号.
单单调换学生时, 如果学生不属一个类别, 不会有问题, 如果有相同类别的后门生都要换班, 那么代码须要更复杂的设计- @echo off & setlocal enableDelayedExpansion
- for %%a in (A B C D) do (
- for /l %%i in (1001 1 1100) do set "sStu=!sStu!%%a-%%i"
- set "sStu=!sStu:-1=-!"& set "base=100"
- for /l %%x in (1 1 10) do (
- for /l %%i in (1 1 10) do (
- set /a "start=(!random!%%base)*5"
- for %%s in (!start!) do (
- set "choose=!sStu:~%%s,5!"
- for %%c in (!choose!) do (
- set "X-%%x=!X-%%x! %%c"
- set "sStu=!sStu:%%c=!"
- set /a base-=1
- ) ) ) ) )
- (echo 开后门之前...)&set X-&pause
- (echo 开后门...)&call :backDoor B-060 X-3 11&call :backDoor C-049 X-8 21
- (echo 开后门之后...)&set X-&pause
- exit /b
-
- :backDoor 学生编号 班编号 班内目标号 如: C-049 安排到 X-8, C 起始于 #21
- for /l %%i in (1 1 10) do (
- if /i "X-%%i" neq "%2" (
- (echo !X-%%i!|find /i "%1">nul)&&(
- for /f "tokens=%3 delims= " %%t in ("!%2!") do (
- (echo 调换: X-%%i 班的 %1 ^<==^> %2 班的 %%t )
- set "X-%%i=!X-%%i:%1=%%t!"
- set "%2=!%2:%%t=%1!"
- )
- exit /b
- ) ) )
- exit /b
复制代码
[ 本帖最后由 neorobin 于 2010-6-28 00:17 编辑 ] |