Yaakov Lake 2021-04-02 19:51 采纳率: 100%
浏览 186
已结题

Java网球循环赛,我还不是很理解 求助求助

一、问题描述:       设有n个运动员要进行网球循环赛。设计一个满足以下要求的比赛日程表:
       (1)每个选手必须与其他n-1个选手各赛一次;
       (2)每个选手一天只能赛一次;
       (3)当n是偶数时,循环赛进行n-1天。当n是奇数时,循环赛进行n天。

能给个详细的源代码吗 谢谢了

  • 写回答

3条回答 默认 最新

  • allway2 2021-04-02 23:18
    关注

    转:https://www.xuebuyuan.com/961847.html

    比赛日程安排算法

    2013年10月01日 ⁄ 综合 ⁄ 共 1215字 ⁄ 字号 小 中 大 ⁄ 评论关闭

    这几天看都一个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);
    
    		}
    	}

     

    package SolutionTennis;
    
    import java.util.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);
    
    		}
    	}
    	public static void main(String[] args) {
    		int n=9;
    
    		T sol = new T(n);
    
    		sol.print();
    	}
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥20 关于#qt#的问题:Qt代码的移植问题
  • ¥50 求图像处理的matlab方案
  • ¥50 winform中使用edge的Kiosk模式
  • ¥15 关于#python#的问题:功能监听网页
  • ¥15 怎么让wx群机器人发送音乐
  • ¥15 fesafe材料库问题
  • ¥35 beats蓝牙耳机怎么查看日志
  • ¥15 Fluent齿轮搅油
  • ¥15 八爪鱼爬数据为什么自己停了
  • ¥15 交替优化波束形成和ris反射角使保密速率最大化