问题描述

有n名选手,其中n=2k。设计一个满足以下要求的比赛日程表:
(1) 每个选手必须与其他n-1个选手各赛一次;
(2) 每个选手一天只能赛一次;
(3) 循环赛一共进行n-1天。
按此要求,将比赛日程表设计成一个 n 行n-1列的二维表,其中,第 i 行第 j 列表示和第 i 个选手在第 j 天比赛的选手。

输入格式

一个整数k(1<=k<=8)

输出格式

一个n*n的数字矩阵,表示赛程表,每行数字以空格作为间隔。第一列从上到下分别是1到n,后面n-1列是比赛日程表。比赛日程表的安排方式很多,请找出字典序最小的方案。具体样式参见样例数据。n=2k

样例输入

3

样例输出

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

思考

•   为什么题目要让 = 2  呢?

•   肯定是要递归,调用2  −1的函数得到2  时的结果!

•   如何递归?找规律。

解析

•   分治算法:

•   开一个全局变量二维数组a[][]存储答案;

•   递归函数solve(k, x, y)的作用是,生成一个规模为2   × 2  的矩阵,矩阵的左上

角在a[][]数组的第x行第y列。

•   函数实现:

•   若k=0,即生成1×1的矩阵。令a[x][y]=1,返回。

•   若k>0,设  = 2 −1,先递归调用四次:

•   solve(k - 1, x, y)                                                                                     solve(k - 1, x, y + m)

•   solve(k - 1, x + m, y)                                                                                     solve(k - 1, x + m, y + m)

•   然后将左下、右上区域每个数都+   。

•   主函数中调用solve(k, 1, 1)。

#include<bits/stdc++.h>
using namespace std;
int a[300][300],k;
void solve(int k,int x,int y,int v) {if(k==0) {a[x][y]=v;} else {int m=1<<k-1;solve(k-1,x,y,v);solve(k-1,x,y+m,v+m);solve(k-1,x+m,y,v+m);solve(k-1,x+m,y+m,v);}
}
int main() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin>>k;solve(k,1,1,1);int n=1<<k;for(int i=1; i<=n; i++) {for(int j=1; j<=n; j++)cout<<a[i][j]<<" ";cout<<endl;}return 0;
}//by czy6666666

NKOI 3590 循环赛日程表相关推荐

  1. python【数据结构与算法】循环赛日程表(分治)

    文章目录 1 概述 2 解决 1 概述 设计一个满足以下要求的比赛日程表: 每个选手必须与其他n-1个选手各赛一次: 每个选手一天只能赛一次: 循环赛一共需要进行n-1天. 由于n=2^k个运动员,显 ...

  2. 循环赛日程表非递归Java_王晓东《算法设计与分析》课件.ppt

    <王晓东<算法设计与分析>课件.ppt>由会员分享,可在线阅读,更多相关<王晓东<算法设计与分析>课件.ppt(356页珍藏版)>请在人人文库网上搜索. ...

  3. 2.11 循环赛日程表

    博主简介:一个爱打游戏的计算机专业学生 博主主页: @夏驰和徐策 所属专栏:算法设计与分析 目录 书本内容: 我的理解: 更优化的算法: 总结 1.注意实现问题 2.当用C语言和C++实现循环赛日程表 ...

  4. 3.2.4循环赛日程表(递归与分治)

    目录 1.问题描述 2.算法分析 算法 3.摘要 参考书籍 1.问题描述 设有个运动员要进行网球循环赛. 现要设计一个满足以下要求的比赛日程表. (1)每个选手必须与其他个选手各比赛一次: (2)每个 ...

  5. 任意人数的循环赛日程表 分治 非分治 c++

    循环赛日程表 要求 设计一个满足以下要求的比赛日程表: 每个选手必须与其他n-1个选手各赛一次: 每个选手一天只能赛一次: 当n是偶数时,循环赛进行n-1天,当n是奇数时,循环赛进行n天: 举例 4位 ...

  6. 分治法解决循环赛日程表

    分治法解决循环赛日程表 问题描述 设有n=2^k个运动员要进行羽毛球循环赛,现要设计一个满足以下要求的比赛日程表: (1)每个选手必须与其他n-1个选手各赛一次. (2)每个选手一天只能比赛一次. ( ...

  7. 循环赛日程表 (递归与分治)

    文章目录 1.题目 2.问题分析 3.什么是分治 4.算法实现思路 1.对表进行分析 2.对表的实现 1.递归 2.循环 5算法实现代码 1.递归 2.循环 6.时间\空间复杂度 1.递归 1.空间复 ...

  8. 分治法-循环赛日程表

    问题描述 循环赛日程表:有n = 2^k个运动员要进行网球循环赛 赛程表满足: 每个选手必须与其他n-1个选手各赛一次 每个选手一天只能参赛一次 循环赛在n-1天内结束 解题思路 将比赛日程表设计成一 ...

  9. 循环赛日程表(非递归)

    #include<iostream> #include<vector> #include<iterator> #include<algorithm> u ...

最新文章

  1. 浅谈 EHT 黑洞照片拍摄原理
  2. JavaScript 技术篇-js代码获取当前操作系统信息、浏览器版本信息实例演示,windows NT版本对照表
  3. 关于GIT的SSH加密问题
  4. 面试39 MySQL读写分离
  5. 1057: [ZJOI2007]棋盘制作 - BZOJ
  6. (数据库系统概论|王珊)第三章关系数据库标准语言SQL-第零节:MYSQL环境安装和表的建立以及一些注意事项
  7. Eclipse 真机调试检测不到手机解决方案
  8. 苹果mac好用的记事本软件:Ulysses 24
  9. Revit软件安装族库/族样板/项目样板默认位置在哪?(详细说明)
  10. cuda+cudnn下载安装
  11. 恒生UFX 统一接入介绍
  12. Drools——什么是规则
  13. Spring Aop(入门篇)
  14. 智力题:1000瓶酒.10只老鼠.有一瓶酒有毒,每只老鼠可以喝无限多的酒,如何测一次就找出哪瓶酒有毒
  15. POI读取Excel(兼容Excel2003、Excel2007)
  16. compiz在debian上的安装和使用
  17. puzzle(0151)《24点》
  18. word批量导入试题,一键组卷,单机软件题库管家迎来1.2版本
  19. 什么是孤独?。。。一款只有6个用户的APP
  20. 2017 ACM Arabella Collegiate Programming Contest G. Snake Rana GYM101350G

热门文章

  1. 微信支付宝多商户解决方案
  2. 关于七彩虹显卡命名解说
  3. 126邮箱OUTLOOKS设置
  4. 剪切caspase3_Caspase-3活性检测
  5. 第5组UI 让你的界面酷炫到底-ViewAniMator之ViewSwitcher、ImageSwitcher(图像切换器)、TextSwitcher(文本切换器)、ViewFlipper
  6. k8s 三种部署方式
  7. 全面解析枚举+联合体~
  8. 六边形地图生成(1)——基础地形
  9. 赚钱App研究之格式转换类app
  10. 数字万用表数字多用表软件下载安装教程