这是我在论坛上回的一个帖子,感觉很有意思就在这里保存下来,以免丢失!
原贴地址: .xml?temp=.7246057
提问(我稍加更改):
一共有n个足球队或更多,进行比赛,每两个球队之间有且只有一次比赛,
每天最大限度可以比 n/2 场,而且每组在一天内不能重复比赛
要求最短的时间内将各队全部的比赛结束!
我的解答:
假设足球队为1,2,,n. 那么总共的比赛场次为n*(n-1)/2.
如果球队数是奇数,则增加一个虚拟队,把球队数凑成偶数,这样,碰见虚拟队的球队相当于当场没有球赛.
那么现在可以推测出来一天最多只有n/2场球赛,否则肯定有球队一天超过一场球赛.组合上,也可以得到,肯定可以实现一天进行n/2场球赛,并且符合要求!
现在我们通过计算来得到一个赛程的安排,(这种安排可以有多种,这里只得到其中一组).先来看一个例子:
//例:6个球队,则输出这样内容,每组必须无重复
//则函数计算出5行,每行3对,2个一对,无重复的组合
1-2,3-4,5-6
2-4,3-5,1-6
3-2,4-6,1-5
4-5,3-1,2-6
5-2,1-4,3-6
我提供的算法主要思路就是从如下无重复的组合中提取一个组合,同时判断是否符合要求
(1,2),(1,3),(1,4),(1,5),(1,6)
(2,3),(2,4),(2,5),(2,6)
(3,4),(3,5),(3,6)
(4,5),(4,6)
(5,6)
具体见下面的算法步骤:
输入num(偶数)时,
用(x,y)模式表示x-y
弄一个邻居表TA,如下是(1,2,3,4,…,i,i+1,…num)的所有二位组合:
p1----> (1,2),(1,3),(1,4)…,(1, num)
p2----> (2,3),(2,4)…(2, num)
p3----> (3,4),…,(3, num)
…
pi---->(i,i+1),…,(i,num)
…
p(num-1)----> (num-1,num)
寻找一组的步骤如下:
初始化:定义集合SA,用来存储已经被包含的x,y,初始化SA={},
注意:未处理(x1,y1):表示(x1,y1)没有被尝试地包含在SA中,所谓尝试,是因为即使被包含进去,也可能被回滚掉!
第1步,取p1中第一个未处理(1,y1),SA ={1,y1};
第2步,如果2在SA中,进入第3步,
否则如果p2存在未处理(2,y2),取p2中第一个未处理(2,y2),SA =SA+{2,y2};
否则如果p2不存在未处理(2,y2),去掉最后加入SA的两个数,然后返回到最后加入元素到SA的那一步;
第3步,如果3在SA中,进入第4步,
否则如果p3存在未处理(3,y3),取p3中第一个未处理(3,y3),SA =SA+{3,y3};
否则如果p3不存在未处理(3,y3),去掉最后加入SA的两个数&
本文发布于:2024-02-01 06:20:50,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170673965034511.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |