标题: [数值计算] 【已解决】如何用批处理写出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
好复杂 。。。- @echo off&setlocal enabledelayedexpansion
- set "str=12345670"
- for /l %%a in (1 1 7) do (
- set "var=!str!"
- for /l %%i in (1 1 4) do (
- set "var=!var: =!"&set "num1=!var:~0,1!"&set "flag="
- for /l %%b in (0 1 7) do set var=!var:%%b= %%b !
- set "var2=!var:~2!"
- for %%b in (!var2!) do (
- if not defined flag (
- if not defined .!Num1!%%b if not defined .%%b!Num1! (
- set .!Num1!%%b=a&set .%%b!Num1!=a&set flag=a&set "t=!Num1!-%%b"
- for %%i in (!num1! %%b) do set var=!var:%%i=!
- )))
- set "#%%a=!#%%a! !t!"
- )
- echo 第 %%a 天 !#%%a!
- )
- 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次之后,顺利排完。- @echo off
- setlocal enabledelayedexpansion
-
- :Main
- cls
- set str=A B C D E F G
- set total=0
- for %%i in (%str%) do set /a total+=1
- set /a team=%total%/2
- set day=0
- for %%i in (%str%) do (
- set str=!str:%%i =! %%i
- set /a day+=1
- set num=0
- for %%j in (!str!) do (
- set /a num+=1
- set str_!num!=%%j
- )
- set str_tmp=
- for /l %%j in (1,1,%team%) do (
- set /a num_tmp=!total!-%%j
- call set str_tmp=!str_tmp! !str_%%j! vs %%str_!num_tmp!%%
- )
- echo 第!day!天:!str_tmp! %%i 轮空
- )
- pause
- goto Main
复制代码
作者: 随风 时间: 2009-5-27 11:48 标题: 回复 5楼 的帖子
好思路,不过代码好像可以更简单。
- @echo off&setlocal enabledelayedexpansion
- set "str=1234567"
- for /l %%i in (1 1 7) do (
- set "str=!str:~1!!str:~0,1!"
- set "var= !str:~0,-1!"
- for /l %%a in (1 1 3)do set .%%i=!.%%i! !var:~%%a,1!-!var:~-%%a,1!
- echo 第 %%i 天 !.%%i! !str:~-1!-0
- )
- 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次之后,顺利排完。- @echo off
- setlocal enabledelayedexpansion
- set "zm= ABCDEFGHIJLMNOPQRSTUVWXYZ"
- :main
- cls
- set/p shu=请输入队伍的数量(从2—26):
- set/a a=!shu!%%2
- set/a b=!shu!/2
- if !a!==0 (set/a lunshu=!shu!-1) else (set/a lunshu=!shu!)
- set str=!zm:~1,%shu%!
- for /l %%m in (1 1 %lunshu%) do (
- set str1=
- set num= %%m
- if !a!==0 (set s= !str!) else (set s=!str!)
- for /l %%n in (1 1 %b%) do (set str1=!s:~%%n,1!-!s:~-%%n,1! !str1!)
- if !a!==0 (echo 第 !num:~-2! 轮对阵表:!str1!
- ) else (echo 第 !num:~-2! 轮对阵表:!str1! 轮空:!str:~0,1!)
- set str=!str:~1,%lunshu%!!str:~0,1!
- )
- pause>nul&goto :main
复制代码
作者: 随风 时间: 2009-5-27 14:13 标题: 回复 7楼 的帖子
这种算法只适合队伍数为单数时,否则会有重复。- @echo off
- set "zm=ABCDEFGHIJLMNOPQRSTUVWXYZ"
- :loop
- setlocal enabledelayedexpansion
- set /p n=请输入队伍的数量,只能是单数(从3—25):&cls
- set /a m=n/2,x=n%%2
- if !x! equ 0 endlocal&goto loop
- set "str=!zm:~0,%n%!"
- for /l %%i in (1 1 !n!) do (
- set "str=!str:~1!!str:~0,1!"
- set "var= !str:~0,-1!"
- for /l %%a in (1 1 !m!)do set .%%i=!.%%i! !var:~%%a,1!-!var:~-%%a,1!
- echo 第 %%i 轮对阵表:!.%%i! 轮空:!str:~-1!
- )
- 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轮空) 到这边就结束了!- @echo off
- setlocal enabledelayedexpansion
- set "zm= ABCDEFGHIJLMNOPQRSTUVWXYZ"
- :main
- cls
- set/p shu=请输入队伍的数量(从2—26):
- set/a a=!shu!%%2
- set str=!zm:~1,%shu%!
- 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)
- for /l %%m in (1 1 %lunshu%) do (
- set str1=&set str2=&set lunkong=&set num= %%m&set s= !str!
- for /l %%n in (1 1 %b%) do (set str1=!str1! !s:~%%n,1!-!s:~-%%n,1!)
- for %%a in (!str1!) do (
- set ss=%%a
- if "!ss:~0,1!"=="0" set lunkong= 轮空:!ss:~-1!&set str2=!str1: %%a=!
- if "!ss:~-1!"=="0" set lunkong= 轮空:!ss:~0,1!&set str2=!str1: %%a=!
- )
- if !a!==0 (echo 第 !num:~-2! 轮对阵表:!str1!) else (echo 第 !num:~-2! 轮对阵表:!str2!!lunkong!)
- set str=!str:~0,1!!str:~-1!!str:~1,%c%!
- )
- pause>nul&goto :main
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |