精华内容
下载资源
问答
  • 循环赛日程表(java)

    2019-10-11 19:09:02
    循环赛日程表 代码如下 package wzf.sorting; import java.util.Scanner; /** * * @title RoundRobinSchedule * @describe 循环赛日程表: * 设有n=2^k个运动员要进行网球循环赛。 * 现要设计一个满足以下...

    算法设计与分析

    循环赛日程表
    代码如下

    package wzf.sorting;
    
    import java.util.Scanner;
    
    /**
     * 
     * @title RoundRobinSchedule
     * @describe 循环赛日程表:
     *           设有n=2^k个运动员要进行网球循环赛。
     *           现要设计一个满足以下要求的比赛日程表:
     *           (1)每个选手必须与其他n-1个选手各赛一次;
     *           (2)每个选手一天只能参赛一次;
     *           (3)循环赛在n-1天内结束。
     *           按此要求将比赛日程表设计成有n行和n-1列的一个表。
     *           在表中的第i行,第j列处填入第i个选手在第j天所遇到的选手。
     * @author wonderful
     * @date 2019年10月11日下午7:06:42
     */
    public class RoundRobinSchedule {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            System.out.println("请输入 k 的值(2^k个运动员)");
            int k = scanner.nextInt();
            scanner.close();
            // 求运动员人数
            int n = 1;
            for (int i = 1; i <= k; i++) {
                n = n * 2;
            }
            // 创建二维数组作为日程表
            int[][] array = new int[n + 1][n + 1];
            // 制作日程表
            table(k, array, n);
            // 输出日程表
            printTable(array, n);
        }
    
        /**
         * 
         * @param k:2^k个运动员
         * @param a:循环赛日程表
         * @param n:运动员的人数
         */
        private static void table(int k, int[][] a, int n) {
            // 设置日程表第一行
            for (int i = 1; i <= n; i++) {
                a[1][i] = i;
            }
            // 每次填充时,起始填充位置
            int m = 1;
            for (int s = 1; s <= k; s++) {
                n /= 2;
                for (int t = 1; t <= n; t++) {
                    // 控制行
                    for (int i = m + 1; i <= 2 * m; i++) {
                        // 控制列
                        for (int j = m + 1; j <= 2 * m; j++) {
                            // 右下角等于左上角的值
                            a[i][j + (t - 1) * m * 2] = a[i - m][j + (t - 1) * m * 2 - m];
                            // 左下角等于右上角的值
                            a[i][j + (t - 1) * m * 2 - m] = a[i - m][j + (t - 1) * m * 2];
                        }
                    }
                }
                m *= 2;
            }
        }
    
        // 输出日程表
        private static void printTable(int[] array[], int n) {
            for (int i = 1; i <= n; i++) {
                for (int j = 1; j <= n; j++) {
                    System.out.print(array[i][j] + " ");
                }
                System.out.println();
            }
        }
    }
    

    运行结果截图
    在这里插入图片描述
    如有不足之处,请见谅!

    展开全文
  • 循环赛日程表

    2014-04-28 20:13:37
    循环赛日程表的程序,可以使用于比赛队数任意的情况,不局限于偶数之队伍 是我认识的一个大神实现的代码
  • 分治法是算法分析与设计中的重要算法之一,在实际应用中,循环赛日程表的制定便是根据其设计的 有完整的代码,可运行,生成可执行exe文件
  • 循环赛日程表java写

    千次阅读 2014-12-07 23:01:17
    这里是循环赛日程表代码 体现的是分治法的思想 package xunhunsaitable; /** * * @author YuYunTan(谭淇蔚) *这里是分治法设计循环赛日程表问题 *假设有n=2的k次方个运动员要进行网球循环赛。 *设计一个...

    这里是循环赛日程表的代码

    体现的是分治法的思想

    package xunhunsaitable;
    /**
     * 
     * @author YuYunTan(谭淇蔚)
     *这里是分治法设计循环赛日程表问题
     *假设有n=2的k次方个运动员要进行网球循环赛。
     *设计一个日程表,规定如下:
     *1.每一个选手必须和其他n-1个选手各赛一次
     *2.每个选手一天只能赛一次
     *3.循环赛一共进行n-1天
     *按照此要求,设计成n行n-1列的表。
     *在表中第i行和第j列处填入第i个选手在第j天所遇到的选手
     *按照分治法策略,将所有选手分为两半,n个选手的比赛日程表就可以通过为n/2个选手设计的比赛日程表来决定
     *递归地用这种一分为二的策略将对手进行分割,直到剩下两个选手时,比赛日程表制定就变得十分简单。
     *这时候只要让这两个选手进行比赛就可以了
     * 算法步骤:
         (1)用一个for循环输出日程表的第一行 for(int i=1;i<=N;i++) a[1][i] = i
         (2)然后定义一个m值,m初始化为1,m用来控制每一次填充表格时i(i表示行)和j(j表示列)的
                           起始填充位置。
         (3)用一个for循环将问题分成几部分,对于k=3,n=8,
                           将问题分成3大部分,
                           第一部分为,根据已经填充的第一行, 填写第二行,
                           第二部分为,根据已经填充好的第一部分,填写第三四行,
                           第三部分为,根据已经填充好的前四行,填写最后四行。
                           for (int s=1;s<=k;s++)N/=2; 
         (4)用一个for循环对③中提到的每一部分进行划分for(int t=1;t<=N;t++)对于第一部分,将其划分为四个小的单元,
         	即对第二行进行如下划分
         	同理,对第二部分(即三四行),划分为两部分,第三部分同理。
         (5)最后,根据以上for循环对整体的划分和分治法的思想,
         	进行每一个单元格的填充。填充原则是:对角线填充 
      选手	第1天	第2天	第3天	第4天	第5天	第6天	第7天	
     1	 2	 3	 4	 5	 6	 7	 8	
     2	 1	 4	 3	 6	 5	 8	 7	
     3	 4	 1	 2	 7	 8	 5	 6	
     4	 3	 2	 1	 8	 7	 6	 5	
     5	 6	 7	 8	 1	 2	 3	 4	
     6	 5	 8	 7	 2	 1	 4	 3	
     7	 8	 5	 6	 3	 4	 1	 2	
     8	 7	 6	 5	 4	 3	 2	 1	
    
     
    
     */
    public class table {
    
    	public static void main(String[] args) {
    		
    		int [][]a = new int [9][9];
    		tablexunhun(3,a);
    		print(a);
    	}
    	private static void print(int[][] a) {
    		// TODO 自动生成的方法存根
    		System.out.print("选手"+"\t");
    		for(int i=1;i<=a.length-2;i++)
    			System.out.print("第"+i+"天"+"\t");
    		System.out.println("");
    		for(int i=1;i<=a.length-1;i++){
    			for(int j=1;j<=a.length-1;j++){
    				System.out.print(a[i][j]+"\t");
    				if(j==a.length-1)
    					System.out.println("");
    			}
    		}
    		
    	}
    	public static void tablexunhun(int k,int [][]a){
    		int n=1;//n就是人员个数
    		for(int i=1;i<=k;i++)n*=2;//计算出选手的个数
    		for(int i=1;i <=n;i++)a[1][i]=i;//第一行弄好
    		int m=1;//每次填充时起始的填充位置
    		for(int s=1;s<=k;s++){
    			n/=2;
    			for(int t=1;t<=n;t++)
    				for(int i=m+1;i <=2*m;i++)//控制行
    					for(int j=m+1;j<=2*m;j++){//控制列
    						
    						a[i][j+(t-1)*m*2]=a[i-m][j+(t-1)*m*2-m];
    						//右下角等于左上角的值
    						a[i][j+(t-1)*m*2-m]=a[i-m][j+(t-1)*m*2];
    						//左下角等于右上角的值						
    					}
    			m*=2;
    		}
    		
    	}
    }
    

    展开全文
  • 分治 循环赛日程表

    2018-10-29 13:18:49
    条件3:循环赛一共进行n-1天 问题的求解方法: 分治,将所有选手分成两半,n个选手的比赛日程表就可以通过n/2个选手设计的比赛日程表来决定 递归进行分割,直到只剩下两个选手。 倒退,首先确定日程表第一行,...

    问题描述:

    对于n=2^k个选手,设计一个满足以下要求的比赛日程表。

    条件1:每个选手必须与其他n-1个选手各赛一次

    条件2:每个选手一天只能赛一次

    条件3:循环赛一共进行n-1天

    问题的求解方法:

    分治,将所有选手分成两半,n个选手的比赛日程表就可以通过n/2个选手设计的比赛日程表来决定

    递归进行分割,直到只剩下两个选手。

    倒退,首先确定日程表第一行,求得第二行,然后求得三四行。。。。。

    代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int a[100][100];
    void SetTable(int k,int n)
    {
        for(int j=1;j<=n;j++)//首先设置日程表第一行
        a[1][j]=j;
        int m=1;//记录了填充的起始行,同时也是填充块数的宽度,从最初行宽度1开始算起
        for(int s=1;s<=k;s++)//共完成k次大循环
        {
            n=n/2;//记录填充块的个数
            for(int t=1;t<=n;t++)
            {
                for(int i=m+1;i<=2*m;i++)
                {
                    for(int j=m+1;j<=2*m;j++)
                    {
                        a[i][j+(t-1)*m*2]=a[i-m][j+(t-1)*m*2-m];//左上方赋值给右下方
                        a[i][j+(t-1)*m*2-m]=a[i-m][j+(t-1)*m*2];//右上方赋值给左下方
                    }
                }
            }
            m=m*2;
        }
    }
    int main()
    {
        memset(a,0,sizeof(a));
        int n=1;
        int k;
        cin>>k;
        for(int i=1;i<=k;i++)
        {
            n=2*n;
        }
        SetTable(k,n);
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                cout<<a[i][j]<<" ";
            }
            cout<<endl;
        }
        return 0;
    }

     

    展开全文
  • NOJ-1243-循环赛日程表

    2020-11-18 22:22:33
    循环赛日程表 代码: #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<cmath> using namespace std; const int maxn=500+50; int n,a[maxn]...

    循环赛日程表

    img

    代码:

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    const int maxn=500+50;
    int n,a[maxn][maxn];
    void dfs(int r,int c,int h){
    	if(h==1)return ;
    	h/=2;
    	a[r+h][c+h]=a[r][c];
    	a[r][c+h]=a[r][c]+h;
    	a[r+h][c]=a[r][c]+h;
    	dfs(r,c,h);
    	dfs(r+h,c+h,h);
    	dfs(r,c+h,h);
    	dfs(r+h,c,h);
    }
    int main(){
    	int i,j;
    	cin>>n;
    	n=pow(2,n);
    	a[1][1]=1;
    	dfs(1,1,n);
    	for(i=1;i<=n;i++){
    		for(j=1;j<n;j++){
    			cout<<a[i][j]<<' ';
    		}
    		cout<<a[i][n]<<endl;
    	}
    	return 0;
    }
    
    展开全文
  • C++循环赛日程表

    2020-10-05 21:14:20
    循环赛日程表 设计一个满足以下要求的比赛日程表 每个选手必须与其他n-1个选手各赛一次 每个选手一天只能赛一次 循环赛一共进行n-1天 思路: 按分治策略,将所有的选手分为两半,n个选手比赛日程表就可以通过为...
  • 设有n=2^k个运动员要进行羽毛球循环赛,现要设计一个满足以下要求的比赛日程表:(1)每个选手必须与其他n-1个选手各赛一次。(2)每个选手一天只能比赛一次。 (3)循环赛一共需要进行n-1天。用分治法实现
  • JAVA代码—算法基础:循环赛日程表

    千次阅读 2018-02-20 14:57:35
    循环赛日程表 问题描述:设有n=2的K次方个运动员要进行乒乓球循环赛。现在要设计一个满足一下条件的比赛日程表: 每个选手必须与其它n-1个选手各比赛一次; 每个选手一天只能赛一次; 循环赛一共进行n-1天。 按...
  • 设有 n = 2的k次方 个运动员要进行网球循环赛。现要设计一个满足以下要求的比赛日程表: (1)每个选手必须与其他n-1个选手各自赛一次。 (2)每个选手一天只能赛一次。 (3)循环赛一共进行n-1天。 算法设计 按分治策略,...
  • 算法之循环赛日程表

    2017-11-03 11:37:52
    算法之循环赛日程表 循环赛日程表 一.问题描叙设有n=2^k个运动员,要进行网球循环赛。现在要设计一个满足以下要求的比赛日程表(1).每个选手必须与其他n-1个选手各赛一场(2).每个选手一天只能赛一次(3).循环赛...
  • 分治法求循环赛日程表

    千次阅读 2018-05-29 16:07:33
    设有n=2^k个运动员要进行网球循环赛。现要设计一个满足以下要求的比赛日程: (1)每个选手必须与其他n-1个选手各赛一次;...用分治法编写为该循环赛设计一张比赛日程表的算法。 题目的分析 采用的是递归
  • 分治中循环赛日程表

    2017-09-19 21:07:17
    设有n=2^k个运动员,要进行网球循环赛。现在要设计一个满足以下要求的比赛日程表:  (1).每个选手必须与其他n-1个选手各赛一场  (2).每个选手一天只能赛一次  (3).循环赛一共进行n-1天 日程表应该7天内...
  • 设计一个满足以下要求的比赛日程表: (1)每个选手必须与其他n-1个选手各赛一次; (2)每个选手一天只能赛一次; (3)循环赛一共进行n-1天。
  • 问题描述设有n=2k个运动员要进行羽毛球循环赛,现要设计一个满足以下要求的比赛日程表: (1)每个选手必须与其它n-1个选手各赛一次; (2)每个选手一天只能比赛一次; (3)循环赛一共需要进行n-1天。 由于n=2...
  • 循环赛日程表问题

    2016-10-13 16:01:42
    问题描述:   设有n=2k(2的k次方)个选手要进行网球循环赛,要求设计一个满足以下要求的比赛日程表: (1)每个选手必须与其他n-1个选手各赛一次; (2)每个选手一天只能赛一次...循环赛日程表问题主要使用分
  • 循环赛日程表的设计

    2021-03-25 19:53:29
    循环赛日程表设计 问题描述:设有n=2^k个运动员,要进行网球循环赛。现在要设计一个满足以下要求的比赛日程表 (1)每个选手必须与其他n-1个选手各赛一场 (2)每个选手一天只能赛一次 (3)循环赛一共进行n-1天 ...
  • 循环赛一共进行n-1天。 按此要求设计一张比赛日程表,该表有n行和n-1列,第i行第j列表示第i个选手第j天遇到的选手。 思路: 不再赘述,只是想熟悉/优化一下代码。。。。。。 代码实现:(不考虑轮空问题) ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,010
精华内容 404
关键字:

循环赛日程表代码