比賽日程安排(JAVA實現)
題目是這樣的
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
|
我的思路是這樣的:
代碼示例如下:
package com.abin;
import java.util.LinkedList;
public class GamePlan {
private int num; // 隊伍數
private LinkedList<Integer> list = new LinkedList<Integer>();
public GamePlan(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(); //獲取最後一個元素
System.out.println(list.get(1));
list.add(1, temp);//將最後一個元素放在List的第二個位置
}
}
}
package com.abin;
public class GamePlanShow {
public static void main(String[] args) {
//實例化GamePlan對象
GamePlan t = new GamePlan(6);
t.print();
}
}