zoukankan      html  css  js  c++  java
  • 赛程表安排

    求n个人(n = 2k)安排循环赛的赛程表,要求任意两组都要塞一场

    分治法思想:

    1.将原先的问题细分为多个子问题;

    2.求得子问题的解;

    3.将子问题的解合并求得问题的解;

    对于赛程安排,可以先以一个人为单位,两个人为一组安排比赛,之后再以之前的两个人为单位,四个人为一组安排比赛,以此类推,会发现最后的赛程表上右上角的的区域和左下角相同,右下角和左上角相同,因此,求得右边的复制左边的即可。

    起点为每个区块左上角的位置,长度为当前需要安排比赛的人数。

    代码如下

    #include<stdio.h>
    #pragma warning(disable:4996)
    #define maxn 200
    int d[maxn][maxn];
    int n;
    void dfs(int s, int num)
    {
    	if (2 == num)
    	{
    			d[s][1] = s;
    		d[s][2] = s + 1;
    		d[s + 1][1] = s + 1;
    		d[s + 1][2] = s;
    		return;
    	}
    	dfs(s, num / 2);
    	dfs(num / 2 + s, num / 2);
    	for (int i = s; i < s+num / 2; i++)
    	{
    		for (int j = num / 2 + 1; j <1+num; j++)
    		{
    			d[i][j] = d[i + num / 2][j - num / 2];
    		}
    	}
    	for (int i = num/2+s; i <s+ num ; i++)
    	{
    		for (int j = num / 2 + 1; j <1+num; j++)
    		{
    			d[i][j] = d[i - num / 2][j - num / 2];
    		}
    	}
    }
    
    
    int main()
    {
    	scanf("%d", &n);
    	dfs(1, n);
    	for (int i = 1; i <= n; i++)
    	{
    		for (int j = 1; j <= n; j++)
    			printf("%d ",d[i][j]);
    		printf("
    ");
    	}
    	getchar();
    	getchar();
    	return 0;
    }
    

      

  • 相关阅读:
    php7.4 降级 php7.1 的坑
    python 记录网页 生成pdf
    Mac 安装常用软件环境
    python 2.7 操作 excel
    007整数反转
    006Z字形变换
    005最长回文子串
    004寻找两个正序数组的中位数
    003无重复字符的最长子串
    002两数相加
  • 原文地址:https://www.cnblogs.com/zxzmnh/p/11622968.html
Copyright © 2011-2022 走看看