文章目录

  • 题目
  • 暴力法
    • 思路
    • 结果
    • 代码
  • 分治法
    • 思路
    • 步骤
    • 代码

原文链接:https://www.yuque.com/cppdev/algo/tko98o

题目

为参加网球比赛的选手安排比赛日程
设有n(=2^k)位选手参加网络循环赛,循环赛共进行n-1天,每位选手要与其他n-1位选手都赛一场,且每位选手每天赛一场,不论空。按此要求编程为比赛安排比赛日程

暴力法

思路

用一个二维的矩阵M[][],行i、列j表示选手

  1. M[i][j]表示i与j比赛是在第几天
  2. 所以我们只需要一半的矩阵
  3. 以下举例用右上角

结果

代码

#include<stdio.h>int M[100][100];int main() {int i,j,z;int day;int n;int flag;scanf("%d", &n);//存在左上角for (i=1; i<n; i++) {for (j=i+1; j<=n; j++) {//分配比赛日期for (day=1; day<n; day++) {flag=1;//第day中i有没有比赛for (z=1; z<i; z++) { //i竖if ( M[z][i]==day ) {flag = 0;break;}}for (z=i+1; z<j; z++) { //i横if ( M[i][z]==day || flag==0 ) {flag = 0;break;}}//第day中j有没有比赛for (z=1; z<j; z++) { //z竖if ( M[z][j]==day || flag==0 ) {flag = 0;break;}}if (flag==0) continue; //这天不行else {M[i][j] = day;break; //分配完毕}}}}printf("输出矩阵\n");for (i=1; i<=n; i++) {for (j=1; j<=n; j++) {printf("%d\t", M[i][j]);}printf("\n");}printf("输出日程表\n");for (z=1; z<n; z++) {printf("\n第%d天:\t", z);for (i=1; i<n; i++) {for (j=i+1; j<=n; j++) {if (M[i][j]==z) {printf("%d-%d\t",i,j);}}}}return 0;
}

分治法

思路

用矩阵M[][]表示比赛,M[i][j]表示第i个选手在第j天的比赛对手是j

【只考虑一天】

  1. 有4个选手(1,2,3,4),第一天安排1和2比赛后,3只能和4比赛
  2. 所以,可以采用分治法,将所有参加比赛的选手n分成两部分,只要确定n/2部分,另外的一部分即可以确定
  3. 一直往下分,直到只剩下两个选手,那今天的比赛就安排完了

【分治法】
举例:只有2个选手的日程安排

选手 第0天 第1天
1
(1号选手)
1
(第0天,1号选手和自己打)
2
(第1天,1号选手和2号打比赛)
2
(2号选手)
2
(第0天,2号选手和自己打)
1
(第1天,2号选手和1号打比赛)

【注意】上面的表格除去第一行、第二行即为矩阵M[][]的内容,接下来的矩阵都不给出第一行和第一列,直接给出矩阵值
【问题】为什么要有第0天呢?第0天的值也是矩阵的内容,需要填充,更好做分治

举例:4个选手(只写出矩阵内容)

举例:8个选手

步骤

举例:8个选手

  1. 求左上角的子表A:左上角子表是前2^(k-1)个选手的比赛前半程的比赛日程
    1,2,3,4选手前3天的比赛安排:左下角子表是剩余的2^(k-1)
    个选手的比赛前半程比赛日程。这个子表和左上角子表的对应关系式,对应元素等于左上角子表对应元素加2^(k-1)
  2. 求左下角的子表B
    5,6,7,8选手前3天的比赛安排,实际就是A的值加一个4
  3. 求右上角的子表C:等于B
  4. 求右下角的子表D:等于A

代码

#include<stdio.h>
#include<math.h>int M[100][100];void GetTable(int n) {int i;int k;int row,col;int length,half;if (n<2) return ;//k=log2(n)k=0;i=n;while (i=i/2) { //tmp=tmp>>1k++;}//初始化M[0][0]=1;M[0][1]=2;M[1][0]=2;M[1][1]=1;//复制k-1次for (i=2; i<=k; i++) {length = pow(2,i); // length = 0x1 << ihalf = length/2; // half = length >> 1//左下角=左上角子表+half(其中:half=2^(i-1))for(row = 0; row < half; row++){for(col = 0; col < half; col++){M[row + half][col] = M[row][col] + half;}}//右上角的子表=左下角的子表for(row = 0; row < half; row++){for(col = 0; col < half; col++){M[row][col + half] = M[row + half][col];}}//右下角的子表等于左上角子表for(row = 0; row < half; row++){for(col = 0; col < half; col++){M[row + half][col + half] = M[row][col];}}}}int main() {int n;int i,j;printf("为多少人安排比赛日程:\n>>> ");scanf("%d", &n);GetTable(n);for (i=0; i<n; i++) {if (i==0) printf("选手\t");else printf("第%d天\t", i);}printf("\n");for (i=0; i<n; i++) {for (j=0; j<n; j++) {printf("%d\t", M[i][j]);}printf("\n");}return 0;
}

[矩阵] 安排比赛日程(暴力与分治法)相关推荐

  1. chatGPT教你算法(4)——分治法

    0. 引言 在计算机科学中,分治法是一种用于解决复杂问题的常用方法.它的核心思想是将大问题分解为若干个规模较小的子问题,递归地解决这些子问题,最后再将它们的结果组合起来得到原问题的解. 本博客将向大家 ...

  2. 用递归与分治策略求解网球循环赛日程表_算法设计:分治法(比赛日程安排)...

    一.算法思路 1.思路 分治算法的思想是:对于一个规模位N的问题,若该问题可以容易解决(比如规模N较小),则直接解决,否则将其分解为M个规模较小的子问题,这些子问题互相独立,并且与原问题形式相同,递归 ...

  3. 分治法解决矩阵乘法问题

    分治法解决矩阵乘法问题 传统for循环: #include<iostream> #include<cstdio> #include <vector> #includ ...

  4. python矩阵乘法分治算法_矩阵乘法的Strassen算法详解 --(算法导论分治法求矩阵)...

    1 题目描述 2 思路分析 3 解法 4 小结 1 题目描述 请编程实现矩阵乘法,并考虑当矩阵规模较大时的优化方法. 2 思路分析 根据wikipedia上的介绍:两个矩阵的乘法仅当第一个矩阵B的列数 ...

  5. 分治法:循环赛日程安排问题

    问题:设有n=2^k个选手参加循环赛,要求设计一个满足以下要求比赛日程表: 1)每个选手必须与其它n-1个选手各赛一次: 2)每个选手一天只能赛一次. 分析,按照上面的要求,可以将比赛表设计成一个n行 ...

  6. Algorithm:C++语言实现之求最大连续子数组(暴力法、分治法、分析法、动态规划法)

    Algorithm:C++语言实现之求最大连续子数组(暴力法.分治法.分析法.动态规划法) 目录 求最大连续子数组 T1.code暴力法  O(n3) T2.分治法   O( n*log(n) ) T ...

  7. 矩阵乘法分治法c语言,分治法举例之矩阵乘法

    分治法举例之矩阵乘法 前言 矩阵按定义直接实现是比较直接简单的.时间复杂度也可以直接得出来是(O(n^3)) 直接实现 class matrix: ''' 为了简单起见,没有对数据做校验. 假设矩阵就 ...

  8. python应用——分治法实现循环赛

    一.要求 用分治法实现循环赛: 一共有n个选手要进行循环赛,请设计一个满足以下要求的比赛日程表: (1)每个选手必须与其他n-1个选手各赛一次: (2)每个选手一天只能赛一次: (3)当n 是偶数,循 ...

  9. 分治法求循环赛日程表

    设有n=2^k个运动员要进行网球循环赛.现要设计一个满足以下要求的比赛日程: (1)每个选手必须与其他n-1个选手各赛一次: (2)每个选手一天只能赛一次: (3)循环赛一共进行n-1天. 按要求可将 ...

  10. 常用十大算法 非递归二分查找、分治法、动态规划、贪心算法、回溯算法(骑士周游为例)、KMP、最小生成树算法:Prim、Kruskal、最短路径算法:Dijkstra、Floyd。

    十大算法 学完数据结构该学什么?当然是来巩固算法,下面介绍了十中比较常用的算法,希望能帮到大家. 包括:非递归二分查找.分治法.动态规划.贪心算法.回溯算法(骑士周游为例).KMP.最小生成树算法:P ...

最新文章

  1. 湖南省计算机二级程序题库,湖南省计算机二级单选题题库(直接打印)
  2. (JAVA学习笔记) 异常处理
  3. Java平台扩展机制#3:SLF4J怪招
  4. 和哪个专业的男生谈恋爱最惨?
  5. Ubuntu16.04LTS修改开机动画
  6. html5 内容载入,HTML5 的 DOMContentLoaded 和 onload
  7. 建立网站的全套流程与详细解释(转载)
  8. java 做猜数字小游戏_Java Properties类:利用Properties类制作猜数字小游戏
  9. vue弹窗调用另一个弹窗_电脑桌面“脏乱差”,插件弹窗广告一个不少,学会say no很重要...
  10. Spark Streaming保存到HDFS目录中案例
  11. C++的MFC 与 HTML 双向通讯
  12. fedora linux搜狗输入法,Linux_Fedora20 32位系统中安装搜狗拼音输入法图文教程,搜狗输入法在windows系统中是非 - phpStudy...
  13. 正态性检验中的统计量D值和统计量W值如何计算?
  14. Mac苹果电脑桌面上的文件突然没了怎么办
  15. 2021-04-29 Mac有效阻止应用联网 - 免费的第三方软件
  16. 我用 go-zero 一周实现了一个中台系统,已开源!
  17. batchsize、iteration、epoch之间的关系
  18. 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include “stdafx.h“”?
  19. SpringBoot+Mybatis+Vue整合
  20. 我收到一份《中国焦虑图鉴》

热门文章

  1. 编写算法将二叉树中所有结点的左、右子树相互交换
  2. 依赖缺失问题 CS0246 未能找到类型或命名空间名“SqlConnection”(是否缺少 using 指令或程序集引用?) CS1069 未能在命名空间“System.Data.SqlClient
  3. The end tag is unbalanced异常
  4. Android 控件数组
  5. YNWA,同样是我们普通人的鞭策
  6. 性能测试流程指南和工具推荐
  7. 图片识别word c#
  8. mysql delete锁_MySQL 的加锁处理,你都了解的一清二楚了吗?
  9. ISO/IEC JTC 1/SC 42人工智能分技术委员会第一次全会在京召开
  10. uniapp 动态插槽 slot 兼容微信小程序 h5 APP