Board logo

标题: [数值计算] 【已解决】如何用批处理写出7支队伍循环比赛的对阵表? [打印本页]

作者: sjzong    时间: 2009-5-26 22:13     标题: 【已解决】如何用批处理写出7支队伍循环比赛的对阵表?

共有7支队伍参加比赛,请写出对阵表,每一天有一支队伍轮空,其他六支捉对厮杀。保证每支队伍都有一次轮空且跟其他六支有对阵过!!

[ 本帖最后由 sjzong 于 2009-5-27 12:55 编辑 ]
作者: namejm    时间: 2009-5-26 22:22

  不太清楚循环比赛的具体含义,还请明示,以免理解不到位而做无用功。

  另,允许对手重复吗,也就是说,上一次是A对B,下一次他们还能不能作为对手?
作者: sjzong    时间: 2009-5-26 22:48     标题: 回复 2楼 的帖子

不能重复的!
举例吧:有五支队伍比赛。
第一天:A vs B        C vs D         E 轮空
第二天:A vs C        B vs E         D 轮空
第三天:A vs D        C vs E         B 轮空
第四天:A vs E        B vs D         C 轮空
第五天:B vs C        D vs E         A 轮空
程序要求就是按照上面的例子列出有七支队伍比赛的对阵表!
作者: 随风    时间: 2009-5-27 01:02

好复杂 。。。
  1. @echo off&setlocal enabledelayedexpansion
  2. set "str=12345670"
  3. for /l %%a in (1 1 7) do (
  4.    set "var=!str!"
  5.    for /l %%i in (1 1 4) do (
  6.      set "var=!var: =!"&set "num1=!var:~0,1!"&set "flag="
  7.      for /l %%b in (0 1 7) do set var=!var:%%b= %%b !
  8.      set "var2=!var:~2!"
  9.      for %%b in (!var2!) do (
  10.         if not defined flag (
  11.           if not defined .!Num1!%%b if not defined .%%b!Num1! (
  12.              set .!Num1!%%b=a&set .%%b!Num1!=a&set flag=a&set "t=!Num1!-%%b"
  13.              for %%i in (!num1! %%b) do set var=!var:%%i=!
  14.     )))
  15.      set "#%%a=!#%%a! !t!"
  16.     )
  17.     echo 第 %%a 天 !#%%a!
  18. )
  19. echo=&pause
复制代码

[ 本帖最后由 随风 于 2009-5-27 01:16 编辑 ]
作者: namejm    时间: 2009-5-27 02:46

  思路:把A-G一字排开之后,
  ① 把第1位上的字母拉到最后1位;
  ② 在头6位字母中,第1位和最后1位配对,第2位和倒数第2位配对,第3位和倒数第3位配对;
  ③ 重复以上过程,则7次之后,顺利排完。
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. :Main
  4. cls
  5. set str=A B C D E F G
  6. set total=0
  7. for %%i in (%str%) do set /a total+=1
  8. set /a team=%total%/2
  9. set day=0
  10. for %%i in (%str%) do (
  11.     set str=!str:%%i =! %%i
  12.     set /a day+=1
  13.     set num=0
  14.     for %%j in (!str!) do (
  15.         set /a num+=1
  16.         set str_!num!=%%j
  17.     )
  18.     set str_tmp=
  19.     for /l %%j in (1,1,%team%) do (
  20.         set /a num_tmp=!total!-%%j
  21.         call set str_tmp=!str_tmp!    !str_%%j! vs %%str_!num_tmp!%%
  22.     )
  23.     echo 第!day!天:!str_tmp!    %%i 轮空
  24. )
  25. pause
  26. goto Main
复制代码

作者: 随风    时间: 2009-5-27 11:48     标题: 回复 5楼 的帖子

好思路,不过代码好像可以更简单。
  1. @echo off&setlocal enabledelayedexpansion
  2. set "str=1234567"
  3. for /l %%i in (1 1 7) do (
  4.    set "str=!str:~1!!str:~0,1!"
  5.    set "var= !str:~0,-1!"
  6.    for /l %%a in (1 1 3)do set .%%i=!.%%i! !var:~%%a,1!-!var:~-%%a,1!
  7.    echo 第 %%i 天  !.%%i! !str:~-1!-0
  8. )
  9. echo=&pause
复制代码

[ 本帖最后由 随风 于 2009-5-27 11:50 编辑 ]
作者: sjzong    时间: 2009-5-27 13:25     标题: 我按照namejm的思路写个试试

感谢namejm的思路,为我节省好多的时间的。下面我是根据namejm的思路,适当改变一下,来满足队伍数不固定的对阵表。
当队伍数量是单数时,例如7支队伍,把A-G一字排开之后,
  ① 把第1位A来轮空
    ② 后面剩下的BCDEFG,第1位和最后1位配对,第2位和倒数第2位配对,第3位和倒数第3位配对;
  ③ 把第1位A调到字符串的最后一位。重复以上过程,则7次之后,顺利排完。
当队伍数量是双数时,例如6支队伍,把A-F一字排开之后,
  ① 在第1位A的前面加上一个空格(目的是来套用单数时的算法)。
    ② 把第2位到第6位的字母(ABCDEF),第1位和最后1位配对,第2位和倒数第2位配对,第3位和倒数第3位配对;
  ③ 把第2位A调到字符串的最后一位,重复以上过程,则5次之后,顺利排完。
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "zm= ABCDEFGHIJLMNOPQRSTUVWXYZ"
  4. :main
  5. cls
  6. set/p shu=请输入队伍的数量(从2—26):
  7. set/a a=!shu!%%2
  8. set/a b=!shu!/2
  9. if !a!==0 (set/a lunshu=!shu!-1) else (set/a lunshu=!shu!)
  10. set str=!zm:~1,%shu%!
  11. for /l %%m in (1 1 %lunshu%) do (
  12. set str1=
  13. set num= %%m
  14. if !a!==0 (set s= !str!) else (set s=!str!)
  15. for /l %%n in (1 1 %b%) do (set str1=!s:~%%n,1!-!s:~-%%n,1! !str1!)
  16. if !a!==0 (echo 第 !num:~-2! 轮对阵表:!str1!
  17.   ) else (echo 第 !num:~-2! 轮对阵表:!str1! 轮空:!str:~0,1!)
  18. set str=!str:~1,%lunshu%!!str:~0,1!
  19. )
  20. pause>nul&goto :main
复制代码

作者: 随风    时间: 2009-5-27 14:13     标题: 回复 7楼 的帖子

这种算法只适合队伍数为单数时,否则会有重复。
  1. @echo off
  2. set "zm=ABCDEFGHIJLMNOPQRSTUVWXYZ"
  3. :loop
  4. setlocal enabledelayedexpansion
  5. set /p n=请输入队伍的数量,只能是单数(从3—25):&cls
  6. set /a m=n/2,x=n%%2
  7. if !x! equ 0 endlocal&goto loop
  8. set "str=!zm:~0,%n%!"
  9. for /l %%i in (1 1 !n!) do (
  10.    set "str=!str:~1!!str:~0,1!"
  11.    set "var= !str:~0,-1!"
  12.    for /l %%a in (1 1 !m!)do set .%%i=!.%%i! !var:~%%a,1!-!var:~-%%a,1!
  13.    echo 第 %%i 轮对阵表:!.%%i!  轮空:!str:~-1!
  14. )
  15. echo=&endlocal&goto loop
复制代码

作者: sjzong    时间: 2009-5-27 15:25     标题: 回复 8楼 的帖子

随风大哥真是细心!我都没有注意到重复!
作者: sjzong    时间: 2009-5-28 00:24     标题: 我再来试试!

如果要考虑队伍的单双数时,应该改用另外一个思路。
当队伍数量是双数时,
思路:a、第1位和最后1位配对,第2位和倒数第2位配对……
      b、保持第1位不变,把最后一位移到第二位,再进行配对
      c、重复(n-2)次即可。
当队伍数量是单数时,直接在后面加上0,目的一是构成双数来适用上面的算法,目的二是和0配对的那支队伍本轮轮空。
举例:4支队伍时
      ABCD 第一轮:A-D B-C   进行转换最后一位D移到第二位
      ADBC 第二轮:A-C D-B   进行转换最后一位C移到第二位
      ACDB 第三轮:A-B C-D  到这边就结束了!
举例:3支队伍时
      ABC0  第一轮:A-0 B-C  (A轮空) 进行转换最后一位0移到第二位
      A0BC  第二轮:A-C 0-B  (B轮空) 进行转换最后一位C移到第二位
      AC0B  第三轮:A-B C-0  (C轮空)  到这边就结束了!
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "zm= ABCDEFGHIJLMNOPQRSTUVWXYZ"
  4. :main
  5. cls
  6. set/p shu=请输入队伍的数量(从2—26):
  7. set/a a=!shu!%%2
  8. set str=!zm:~1,%shu%!
  9. if !a!==0 (set/a lunshu=!shu!-1&set/a b=!shu!/2&set/a c=!shu!-2) else (set/a lunshu=!shu!&set str=!str!0&set/a b=!shu!/2+1&set/a c=!shu!-1)
  10. for /l %%m in (1 1 %lunshu%) do (
  11. set str1=&set str2=&set lunkong=&set num= %%m&set s= !str!
  12. for /l %%n in (1 1 %b%) do (set str1=!str1! !s:~%%n,1!-!s:~-%%n,1!)
  13. for %%a in (!str1!) do (
  14.   set ss=%%a
  15.   if "!ss:~0,1!"=="0" set lunkong= 轮空:!ss:~-1!&set str2=!str1: %%a=!
  16.   if "!ss:~-1!"=="0" set lunkong= 轮空:!ss:~0,1!&set str2=!str1: %%a=!
  17. )
  18. if !a!==0 (echo 第 !num:~-2! 轮对阵表:!str1!) else (echo 第 !num:~-2! 轮对阵表:!str2!!lunkong!)
  19. set str=!str:~0,1!!str:~-1!!str:~1,%c%!
  20. )
  21. pause>nul&goto :main
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2