[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
排版请在相应的地方改成[Tab]键,就可以行列对齐,好看一点。

先把特殊家伙的给提出来,到适当的时候再放回去~~
加入随机数后,利用了set $排序,得到了随机的结果,
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%b in (1,1,100) do (
  3.         set n=!n! %%b
  4. )
  5. for %%a in (A B C D) do (
  6.         set #%%a=!n!
  7.         for /l %%b in (1,1,10) do set _%%a%%b=10
  8. )
  9. set ##B3=B-60&set #B=!#B: 60=!
  10. set ##C8=C-49&set #C=!#C: 49=!
  11. set/a _B3-=1,_C8-=1
  12. for %%a in (A B C D) DO (
  13.         for %%b in (!#%%a!) do set $%%a_!random:~-2!_%%b=1
  14. )
  15. set n=1
  16. for /f "tokens=1,2,3 delims=$_=" %%a in ('set $') do (
  17.         for %%k in (!n!) do (
  18.                 set X%%k=!X%%k!%%a-%%c        
  19.                 set /a _%%a%%k-=1
  20.                 if !_%%a%%k! equ 0 (
  21.                         set/a n=n%%10+1
  22.                         if defined ##%%a!n! call set X!n!=%%X!n!%%%%##%%a!n!%%        
  23.                 )
  24.         )
  25. )
  26. for /l %%a in (1,1,10) do (
  27. echo;第%%a班:
  28. echo !x%%a!
  29. )
  30. pause
复制代码

[ 本帖最后由 netbenton 于 2010-6-28 01:28 编辑 ]
1

评分人数

TOP

我先后给出的代码分别采用了两种思路:

第 1 种. 在每一类学生里, 每 100 个学生逐个排进随机的班号里, 须对班号排满 10 个与否计数判断处理
第 2 种. 在每一类学生里, 每 100 个学生先行编进线性表(字符串实现),
然后, 10 个班依次在表里随机取出 10 个学生,
每取出一个学生后, 随机索引的上限逐次减 1, 线性表中对应的学生编号也删除掉
直到安排好所有 400 名学生进入 全部 10 个班

后门: 找出后门生所在的班, 再与后门生要去的目标班里的同类的第一个学生调换
因为两个后门生, 分属不同的 B 和 C 类, 所以代码上不用考虑两次(最多可能)调换之间的矛盾.

TOP

后门: 找出后门生所在的班, 再与后门生要去的目标班里的同类的第一个学生调换
假设3班的第一个学生是 c49 呢?考虑这个问题没有。
技术问题请到论坛发帖求助!

TOP

回复 18楼 的帖子

我的解法中 c49 不可能是 3 班的第一个学生, C 类的学生只能是第 21--30 个的范围之内, B 类只会和其他班的 B 类学生调换, 而且不同类别的学生 在一个班内部的编号不可能相同:
A: 1--10
B: 11-20
C: 21-30
D: 31-40
只要题目不要求有多于一个的同类的后门生都要安排, 我的代码不须进一步复杂

TOP

终于知道如何使用随机来解此题了。哎,看来真得新建个帐号,不然真的没人回答中校的简单问题

[ 本帖最后由 sgaizxt001 于 2010-6-28 08:56 编辑 ]
努力学习,努力挣分

TOP

本想再写一个,看了16楼 netbenton 代码,感觉无论在效率还是简洁都以无法超越了,放弃。
赞一个。
技术问题请到论坛发帖求助!

TOP

救命!!!

下面这段代码很简洁,但不知为什么总是1班不对,其他没什么问题,眼睛看红了脑袋想破了,也没找到原因,大家
都来帮帮忙吧!
  1. @echo off&setlocal enabledelayedexpansion
  2. for %%a in (A B C D) do (
  3.     set /a m=1
  4.     for /l %%b in (1,1,100) do if "%%a-%%b" neq "B-60" if "%%a-%%b" neq "C-49" set "%%a#!random!_%%b=%%a-%%b"
  5.     for /f "tokens=2 delims==" %%b in ('set %%a#') do (
  6.         set /a n+=1
  7.         for %%c in (!m!) do (
  8.             set "X-%%c=!X-%%c! %%b"&set /a v=10
  9.             for %%d in (B3 C8) do if "%%a%%c" equ "%%d" set /a v=9
  10.             if !n! equ !v! set /a n=0,m+=1
  11.         )
  12.     )
  13. )
  14. set "X-3=%X-3% B-60"&set "X-8=%X-8% C-49"
  15. for /l %%a in (1,1,10) do cls&echo X-%%a班:&echo.&echo !X-%%a:~1!&pause>nul
复制代码
思路:
  依次将四组学生(除去后门生)按乱序后平分的方法分到10个班,每组分配到每班的学生是10名(当后门生所在
组遇到3、8班时则只分配9名学生),最后将后门生加到所要到的班次中就是的。在实际上校方制作398个四组十类
标签,其中3班高等生组标签和8班中等生组标签各9个,其余各班各组标签各10个,让学生在报到时按组抽签,最后
将后门生直接安排到要到的班级就可以了。
----------------------------------------------------------------------------------------------------------------------------------------------
哈哈,解决了!晕,原来是错将C8写成了D8,真的是太粗心了。

[ 本帖最后由 batman 于 2010-6-28 11:30 编辑 ]
1

评分人数

    • 随风: 好,更简洁。技术 + 1
***共同提高***

TOP

这个题倒是让我想起了如何用bat操作数组。本想模拟几个数组处理函数,还没设计好。
  1. @echo off
  2. setlocal enableDelayedExpansion
  3. set num=100
  4. set class_num=10
  5. for %%a in (A B C D) do (
  6. call :getRanArr %%a 1 %num%
  7. set %%a=!%%a:#=%%a!
  8. )
  9. set backdoor1=B60
  10. set backdoor2=C49
  11. set target1=3
  12. set target2=8
  13. set /a cnt = num / class_num
  14. for /l %%a in (1 1 %class_num%) do (
  15. for %%x in (A B C D) do (
  16. for /l %%i in (1 1 %cnt%) do (
  17. for /f %%A in ("!%%x!") do set class_%%a=!class_%%a! %%A& set %%x=!%%x:*%%A =!
  18. )
  19. )
  20. echo class %%a:
  21. echo !class_%%a:~1!
  22. echo;
  23. if /i "!class_%%a:%backdoor1%=!" neq "!class_%%a!" set postion1=%%a
  24. if /i "!class_%%a:%backdoor2%=!" neq "!class_%%a!" set postion2=%%a
  25. )
  26. echo yesterday: %backdoor1%=%postion1%, %backdoor2%=%postion2%
  27. echo;
  28. call :go_backdoor 1 //后来加的
  29. call :go_backdoor 2
  30. echo;
  31. pause
  32. exit /b
  33. :go_backdoor //^_^//
  34. set backdoor=!backdoor%1!
  35. set postion=!postion%1!
  36. set target=!target%1!
  37. set class_%postion%=!class_%postion%:%backdoor%=...!
  38. set class_%target%=!class_%target%! %backdoor%
  39. rem catch a scape-goat
  40. set level=%backdoor:~0,1%
  41. set str=!class_%target%:*%level%=!
  42. for /f %%a in ("!str!") do set scape-goat=%level%%%a
  43. set class_%target%=!class_%target%:%scape-goat% =!
  44. set class_%postion%=!class_%postion%:...=%scape-goat%!
  45. echo new class %postion%:
  46. echo !class_%postion%!
  47. echo new class %target%:
  48. echo !class_%target%!
  49. echo;
  50. goto :eof
  51. :getRanArr arrName start end [step] //不对参数作合法性检查,coder自己保证参数的正确性
  52. setlocal enableDelayedExpansion
  53. set /a "start=%2, end=%3, step=(^!(%40/10))|(%40/10)"
  54. set "_ret="
  55. for /l %%a in (%start% %step% %end%) do set #_!random!_%%a=1
  56. for /f "tokens=2 delims=#_=" %%a in ('set #_') do set _ret=!_ret! #%%a
  57. endlocal & set %1=%_ret:~1%
  58. goto :eof
  59. rem ToDo: find time to implement these function
  60. rem How about letting bat operate array? Crazy or not?
  61. :shuffle arrName len cnt //洗牌
  62. :slice arrName start [end] //返回一个数组的一段(指定起停)
  63. :sliceLen arrName start length //返回一个数组的一段(指定长度)
  64. :splice arrName start deleteCount //从一个数组中移除一个或多个元素,如果必要,在所移除元素的位置上插入新元素,返回所移除的元素
复制代码
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

我的思路竟然和随风基本上是一样的!

代码有点啰嗦,最近在学习编程规范。
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

回复 15楼 的帖子

以下为 cmd 输出重定向到文件的方法 摘取 随风 15 楼代码的一次输出
3班
a72 a13 a8 a95 a25 a91 a29 a37 a92 a54 b25 b70 b3 b55 b32 b47 b28 b52  b99 c50 c72 c40 c100 c57 c54 c95 c96 c38 c42 d97 d34 d57 d92 d22 d63 d61 d16 d37 d24 b99 b60

5班
a52 a36 a75 a70 a99 a68 a33 a50 a84 a24 b35 b100 b7 b46 b23 b14 b69 b16 b59 b40  c37 c69 c76 c29 c93 c94 c23 c67 c70 d42 d20 d80 d49 d53 d7 d21 d54 d75 d81 c27

8班
a90 a15 a9 a74 a39 a7 a57 a23 a78 a67 b8 b31 b48 b68 b37 b27 b97 b80 b34 b20 c5 c7 c75 c26 c56 c82 c98 c62 c13 c27 d84 d27 d3 d98 d64 d30 d82 d87 d74 d26 c49

发现 b 类和 c 类学生总会多出一个, 有可能在同一个班, 也可能在不同的班:
此次输出中, 3 班有 2 个 b99, 而 5 班和 8 班各有一个 c27

用 notepad++ 查找输出文件中的 b 和 c 计数, 总是得到 101 个结果.

TOP

回复 25楼 的帖子

感谢提醒
确实会这样,原因是只记得替换忘记删除原来的了
代码太垃圾,也懒的改了,汗,为了开个后门,代码比原来长了一倍~~~
技术问题请到论坛发帖求助!

TOP

小弟表示不急, 按以前的感觉是越晚做出来越好。不过越晚就越没人鸟了=。=

TOP

不知道你们运行了我22楼的代码不,要说简洁已经相当简洁了,效率也还行(要搞速就需要在乱序上下功夫了,用set *确实有点慢)。

期望大家能想出更好的方法来。
***共同提高***

TOP

  1. @echo off & SetLocal EnableDelayedExpansion
  2. set /a n=0,X=1,B_60=0,C_49=0
  3. :loop
  4. for %%a in (A B C D) do (
  5.     if "!_%%a!" neq "1" (
  6.         set /a %%a=!random!%%100+1
  7.         if defined %%a_!%%a! (set repeat=1) else set /a %%a_!%%a!=0,_%%a=1
  8.     )
  9. )
  10. if "%repeat%"=="1" set repeat=0 & goto loop
  11. set "X-%X%=!X-%X%!A-%a% B-%B% C-%C% D-%D% "
  12. set /a n+=1,_A=0,_B=0,_C=0,_D=0,1/(n%%10) 2>nul || set /a X+=1
  13. if %n%==30 set "X-3=!X-3:B-%B%=B-60!" & set "B_%B%="
  14. if %n%==80 set "X-8=!X-8:C-%C%=C-49!" & set "C_%C%="
  15. if %n% lss 100 goto loop
  16. for /l %%a in (1 1 10) do echo X-%%a: & echo !X-%%a! & pause & cls
复制代码
思路:
按班级顺序分配,学生是随机的。
一个班 10 次 goto,每次 goto 生成四个随机数(优等生、高等生、中等生、差等生),如果某个随机数定义过,则重复这次 goto。
原意是 100 次 goto,但不可能没有重复随机数...我计算了下,要 goto 一千次左右...

[ 本帖最后由 iti50i68j2h0 于 2010-6-28 22:04 编辑 ]
1

评分人数

TOP

再发一个

:: 生成 1--100 的随机数序列, 删除掉 后门生编号, 平分进 10 个班,
:: 但 X-10 班会少分两个学生.
:: 将 3 班的第 1 个 B 类学生剪切给 10 班, 再把 B-060 加入 3 班
:: 将 8 班的第 1 个 C 类学生剪切给 10 班, 再把 C-049 加入 8 班
  1. @echo off&setlocal enableDelayedExpansion&mode con cols=126
  2. for /l %%i in (1001 1 1100) do set "sStu=!sStu!S-%%i"
  3. set "sStu=!sStu:-1=-!"
  4. for %%a in (A B C D) do (
  5.   set sS=!sStu:S=%%a!& set sS=!sS:B-060=!& set "sS=!sS:C-049=!"
  6.   set "UP=100" & if %%a geq B if %%a leq C set "UP=99"
  7.   for /l %%x in (1 1 10) do (for /l %%i in (1 1 10) do (
  8.       if !UP! gtr 0 ( set /a "start=!random!%%UP*5"
  9.         for %%s in (!start!) do (for %%c in (!sS:~%%s^,5!) do (
  10.           set "X-%%x=!X-%%x! %%c"& set "sS=!sS:%%c=!"& set /a UP-=1
  11. ) ) ) ) ) )
  12. echo 开后门之前:&set X-& set "X-10=!X-10!!X-3:~60,6!!X-8:~120,6!"
  13. set X-3=!X-3:~0,60! B-060!X-3:~66!& set "X-8=!X-8:~0,120! C-049!X-8:~126!"
  14. echo 开后门之后:&set X-&pause
复制代码

TOP

返回列表