赛程表安排

求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("\n");
	}
	getchar();
	getchar();
	return 0;
}

  

原文地址:https://www.cnblogs.com/zxzmnh/p/11622968.html

时间: 2024-11-01 03:11:05

赛程表安排的相关文章

lintcode 输出赛程表

在NBA季后赛期间,我们总是安排一支实力相当强的球队去和实力较弱的球队比赛,比如让排名第1的球队和第n的球队一起比赛,这是一个让比赛更有趣的好策略.现在给定n个球队,你需要以字符串的形式返回他们的最终赛程. n 组球队以正整数的形式给出,从1到n,表示它们的初始排名.排名第1的是实力最强的球队,排名n最弱的球队.我们将使用括号() 和逗号, 来表示比赛团队的配对--括号()表示比赛的组而逗号,表示间隔.在每一轮的配对过程中,你都需要遵循这个策略,那就是让一个相当强的和一个相当弱的配对. n的范围

数据类型和常用数据结构

1.数据类型 几乎是所有的程序设计语言都会讲到数据类型的概念.简单的说,数据类型就是一个值的集合及在这些值上定义的一系列操作的总称.例如:对于C语言的整数类型,其有一定的取值范围,对于整数类型还定义了加法.减法.乘法.除法和取模运算等操作. 按照数据类型的值是否可以分解,数据类型可以分为基本数据类型和聚合数据类型. *基本数据类型:其值不能进一步分解,一般是程序设计语言自身定义的一些数据类型,例如C语言中.字符型.浮点型等. *聚合数据类型:其值可以进一步分解为若干分量,一般是用户自定义的数据类

2017 UESTC Training for Dynamic Programming

2017 UESTC Training for Dynamic Programming A    思维, 或 dp, 很有意思 方法1: 构造法:蛇形安排赛程表算法复杂度:O(N^2)将1-N排成两竖列,每一轮同一行的为对手保持1的位置不变,其他位置按顺(逆)时方向依次旋转1    6          1    2          1    3          1    4          1    5      2    5          3    6          4   

完全模拟FIFA2014世界杯 原创求顶!

还沉浸在2014世界杯吗? 快用程序模拟属于自己独一无二的世界杯吧! FIFA2014世界杯模拟器 你值得拥有 // 类 player. team的定义及实现, 代码放到 player_team.cpp 中 1 #include <iostream> 2 #include <string> 3 using namespace std; 4 class player { 5 public: 6 player(); 7 player(int number, string name, s

十八哥mysql复习集合

mysql复习 一:复习前的准备 1:确认你已安装wamp 2:确认你已安装ecshop,并且ecshop的数据库名为shop 二 基础知识: 1.数据库的连接 mysql -u -p -h -u 用户名 -p 密码 -h host主机 2:库级知识 2.1 显示数据库: show databases; 2.2 选择数据库: use dbname; 2.3 创建数据库: create database dbname charset utf8; 2.3 删除数据库: drop database d

循环赛日程表(非递归)

#include<iostream> #include<vector> #include<iterator> #include<algorithm> using namespace std; /* *循环赛日程表(非递归) */ void Copy(int **map,int sr,int sl,int dr,int dl,int k) { for (int i = 0; i < k; i++) { for (int j = 0; j < k;

循环赛日程表(递归法)

#include<iostream> #include<vector> #include<iterator> #include<algorithm> using namespace std; /* *循环赛日程表(递归法) */ void Copy(int **map,int sr,int sl,int dr,int dl,int k) { for (int i = 0; i < k; i++) { for (int j = 0; j < k;

排球运动规则简介

排球运动简介 排球运动由两队各留名选手组成,但是现在增设了自由人,该运动的目的在于使击出的球稍高于网前伸出的双手,从而是秋落入对方的半场而得分. 每队的球员都有自己固定的位置,三名网前选手和三名靠近底线的选手.每一方击球过网不得超过三次,原则上一名攻击手将和一名队友在网前拦截,阻止球落入本方半场并可以通过拦截直接得分. 简单来说,运动员不得持球,不得连续击球两次.他们可以用身体的任何一个部位击球,但是如果球从球员身上的某一部位弹到另一部位时,将被认作是两次击球,按违例计算.如果球员在界外击球或击

燕十八msyql 笔记

mysql复习 一:复习前的准备 1:确认你已安装wamp 2:确认你已安装ecshop,并且ecshop的数据库名为shop 二 基础知识: 1.数据库的连接 mysql -u -p -h -u 用户名 -p 密码 -h host主机 2:库级知识 2.1 显示数据库: show databases; 2.2 选择数据库: use dbname; 2.3 创建数据库: create database dbname charset utf8; 2.3 删除数据库: drop database d