[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

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

[ 本帖最后由 sjzong 于 2009-5-27 12:55 编辑 ]
1

评分人数

    • Batcher: 感谢主动给标题标注[已解决]字样PB + 2

回复 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 轮空
程序要求就是按照上面的例子列出有七支队伍比赛的对阵表!

TOP

我按照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
复制代码

TOP

回复 8楼 的帖子

随风大哥真是细心!我都没有注意到重复!

TOP

我再来试试!

如果要考虑队伍的单双数时,应该改用另外一个思路。
当队伍数量是双数时,
思路: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
复制代码

TOP

返回列表