這幾天看都一個ITAT比賽的一道題 題目是這樣的
1、 設有n個球隊要進行排球循環賽,設計一個滿足以下要求的比賽日程表:
a) 每個球隊必須與其他n-1個球隊各賽一次;
b) 每個球隊一天只能賽一次;
c) 當n是偶數時,循環賽進行n-1天。當n是奇數時,循環賽進行n天。
n=6的比賽日程表示例(把6個隊從1到6進行編號):
n=6的比賽日程表
第一天 |
第二天 |
第三天 |
第四天 |
第五天 |
1~2 |
1~3 |
1~4 |
1~5 |
1~6 |
3~5 |
2~4 |
2~5 |
2~6 |
2~3 |
4~6 |
5~6 |
3~6 |
3~4 |
4~5 |
n=5的比賽日程表示例(增加編號0,凡碰0者該天即輪空):
n=5的比賽日程表
第一天 |
第二天 |
第三天 |
第四天 |
第五天 |
1~0 |
1~5 |
1~4 |
1~3 |
1~2 |
2~5 |
0~4 |
5~3 |
4~2 |
3~0 |
3~4 |
2~3 |
0~2 |
5~0 |
4~5 |
想了好久也看了很多參考資料 什麼分治算法 。(看的不是很明白)
後來在貼吧上看的有人跟了個很棒的思路!
------------------------------------------------------------------------------------------------
以6隊爲例,用數字表示,排成一個環形。
1號隊不動,每一輪,逆時針轉動,讓各隊從1號頭上依次跳過,每移位一次得出的對陣就是本輪對陣。
無論有多少個隊結果都是符合要求的
具體實現時用一個數組來處理就好了
---
1 4
2 5
3 6
---
1 5
4 6
2 3
---
1 6
5 3
4 2
---
1 3
6 2
5 4
----
1 2
3 4
6 5
----------------------------------------------
由 ahyyxx222提供
確實簡單不少
我用了一個LinkedList實現
public class T{
private int num; // 隊伍數
private LinkedList<Integer> list = new LinkedList<Integer>();
public T(int n)
{
this.num = n;
init();
}
private void init()
{
if (num % 2 == 0) //偶數個隊伍
{
for (int i = 0; i < num; i++)
{
list.add(i + 1);
}
}
else //奇數個隊伍
{
for (int i = 0; i < num; i++)
{
list.add(i + 1);
}
list.add(0);
}
}
public void print()
{
for (int i = 0; i < list.size() - 1; i++)
{
System.out.println("第" + (i + 1) + "天");
for (int j = 0; j < list.size() / 2; j++)
{
System.out.println(list.get(j) + "--"
+ list.get(list.size() - 1 - j));
}
int temp = list.pollLast(); //移動
list.add(1, temp);
}
}