算法设计与分析-分治实验-第二题

2023-10-26

题目

循环赛日程表的设计:

设计一个满足以下要求的比赛日程表(n=2k):

(1)每个选手必须与其他n-1个选手各赛一次;

(2)每个选手一天只能赛一次;

(3)循环赛一共进行n-1天。

要求:输入选手的数量,需要有效性检查,满足n=2k条件,以矩阵形式输出循环赛日程表。

输出:

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

算法设计描述

由题可知,该赛程表中共n行n列,结构可选取二维数组来操作,其中第i行表示第i个选手的日程表,第一列是选手位列,其余第j列表示第j天遇到的对手。所以实际上我们需要的是n-1列。利用分治策略的思想,我们可以将所有选手分成两半,则n名选手的赛程可由\frac{n}{2}名选手来决定(从颜色区块就可以看出,矩阵是呈对角线对称的,左上角和右下角一致,右上角和左下角一致)。再递归地继续划分选手,直到将问题规模缩小至2位选手时,我们就可以直接让他们比赛即可。

大致思路图:

代码

#include <iostream>
#include <vector>
using namespace std;

void printData(vector<vector<int> >& map)
{
    // C++刚学不太熟练,练练迭代器qwq
    vector<vector<int> >::iterator outerP;
    vector<int>::iterator innerP;
    for(outerP = map.begin(); outerP != map.end(); outerP++){
        for(innerP = (*outerP).begin(); innerP != (*outerP).end(); innerP++){
            cout << *innerP << " ";
        }
        cout << endl;
    }
    cout << "\n";
}

// x和y用来存放每次划分所得矩阵的左上角顶点位置,k存储矩阵的行列数
void partition(vector<vector<int> >&map, int x, int y, int k)
{
    // 递归终止条件
    if(k == 1) return;
    // 划分并填充左上角
    partition(map,x,y,k/2);
    // 划分并填充右上角
    partition(map,x,y+k/2,k/2);
    for(int i = 0; i < k/2; i++){
        for(int j = 0; j < k/2; j++){
            // 将左上角复制到右下角
            map[x+i+k/2][y+j+k/2] = map[x+i][y+j];
            // 将右上角复制到左下角
            map[x+i+k/2][y+j] = map[x+i][y+j+k/2];
        }
    }
}

int main()
{
    cout << "请输入选手数量n,要求满足n = 2^k :";
    int flag = 1;
    int n = 0;
    // 有效性检查,输入有误则要求用户重新输入
    while(flag){
        cin >> n;
        // 如果输入的值与定义的变量类型不同,cin.fail()为真
        if(cin.fail() || n%2 != 0){
            cout << "您的输入有误,请重新输入!\n";
            cin.clear();//清除了fail错误
            cin.ignore();//清除缓冲区内的错误字符
        }else
            flag = 0;
    }
    // 建立二维数组存放赛程表
    vector<vector<int> > map(n,vector<int>(n));

    // 初始化第一行为1~n,则第一名选手的赛程已安排好
    for(int i = 0; i < map.size(); i++){
        for(int j = 0; j < map[0].size(); j++){
            map[0][j] = j+1;
        }
    }
    partition(map,0,0,n);
    printData(map);

    return 0;
}

实验结果

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

算法设计与分析-分治实验-第二题 的相关文章

随机推荐

  • 【工具类】工具类中使用@Autowired

    Component public class Util private static String b Autowired private String a PostConstruct public void init b a Compon
  • SQL server删除表信息代码

    SQL server删除表信息代码 1 delete删除 delete from table 只是删除了表中的内容 并没有把表删除 2 drop删除 drop table 表名 把整个表都删除 3 truncate删除 truncate t
  • 通用mybatis执行sql工具系列解决方案lingdu

    整套逻辑可执行保存到数据库中的sql例如 select from a where a name ling name ling name中的name是由前端传入的参数 经过Lingdu类的动态封装 传入到mapper xml中的sql字符串中
  • python 处理hbase数据

    使用Python调用happybase库 1 thrift 是facebook开发并开源的一个二进制通讯中间件 通过thrift 我们可以用Python来操作Hbase 首先开启Hadoop平台的HadoopMaster的thrift服务
  • 使用webpack中的externals配置项如何配置

    externals配置项用于配置那些不需要打包进应用程序中的第三方依赖 在webpack配置文件中 可以使用以下方式配置externals module exports externals jquery jQuery 上面的配置表示jque
  • gdb C++程序coredump不显示行号问题

    编译程序的时候加上 g就可以了 编译出来的程序会大不少 然后再去gdb就能显示行号了 直接就能定位到具体那一行导致的程序coredump
  • 虚拟机下为ubuntu添加硬盘

    1 在Vm中关闭Ubuntu 设置 中 添加新的硬件设备 选择Hard Disk 点击下一步 2 选择硬盘类型 可以选择IDE 或是SCSI 这里选择SCSI 3 选择虚拟新硬盘的位置 命名 Ubuntu2 vmdk 4 设定硬盘大小 随便
  • python解带L1正则的最小二乘

    给定 H R d n H in R d times n
  • 存储卡目录变成未知文件?这些技巧能让你恢复数据!

    当存储卡的目录变成未知文件时 我们无法直接访问存储卡中的数据 但是 这并不意味着这些数据永远无法恢复 以下是几种可能恢复存储卡数据的方法 使用数据恢复软件 从互联网上下载并安装专业的数据恢复软件这些软件可以扫描存储卡 找回已删除或损坏的数据
  • 用MATLAB的GUI绘图的一个简单例子

    本文参考自https jingyan baidu com article 0f5fb099ade1626d8334ead0 html 略加改动 常用MATLAB进行一些计算 使用GUI功能的话调整参数的时候会比较方便 首先在MATLAB中选
  • FCA-FineReport帆软认证报表工程师(FCA)考试考题

    Part 1 判断题 总分 60分 得分 56 第1题 判断题 进行决策系统平台目录管理时 链接的地址可以选择使用相对路径或绝对路径 得分 2分 满分 2分 正确答案 A A 正确 B 错误 第2题 判断题 次级管理员可新建 编辑 删除有权
  • 爬虫的“黄金搭档”---requests库的详细介绍

    什么是requests Requests is an elegant an simple HTTP library for Python Requests是一个优雅而简单的HTTP库 requests库是一个常用的用于http请求的模块 它
  • 转发UGUI事件响应

    示例 点击UI时 被遮挡的UI也响应 using System Collections using System Collections Generic using System Linq using UnityEngine using U
  • SQL之DML

    DML Data Manipulation Language 数据操作语言 用来对数据库中表的数据记录进行增删改操作 insert 添加数据 update 修改数据 delete 删除数据 1 给指定字段添加数据 insert into 表
  • SlideLive:基于Elasticsearch Suggester实现搜索框提示功能

    简介 SlideLive网站使用Elasticsearch作为文档的搜索引擎 我们需要在搜索下拉框实现如下三种功能 自动补全 Auto Completion 纠错 热词推荐 ElasticSearch 为我们提供了Suggester功能 可
  • Hive整理

    文章目录 1 Hive 概述 2 1 Hive 优缺点 2 2 Hive 基础架构 2 HQL 转化为 MR 过程 3 Hive和RDBMS有什么异同 4 Hive 元数据保存方式 5 内部表 和 外部表 6 Hive 如何进行权限控制 7
  • 三年内人人有FIL,FIL 世界零撸板块引发全球流量狂潮!

    FIL 世界零撸板块自5月27日推出以来 就获得了全球Filecoin社区的热烈追捧 在短短一周内就吸引了全球20万粉丝的加盟 引发了全球价值流量狂潮 FIL世界是一个基于Filecoin整个产业链的综合性服务平台 致力于为IPFS行业生态
  • 【Vue实用功能】Vue实现文档在线预览功能,在线预览PDF、Word、Excel、ppt等office文件

    文章目录 TOC 文章目录 方法一 Luckysheet 预览 方法二 Office Web 查看器 微软的开发接口 方法三 XDOC文档预览云服务 预览pdf word xls ppt 方法一 Luckysheet 预览 Luckyshe
  • 服务器系统2022安装wsl2,微软win10子系统wsl2安装教程(附三个实例应用场景)

    wsl2与今年6月份微软buld的大会上发布消息 7月15日左右开始正式加入windows inside版本 熟悉wls win10子系统 一代的都知道 这东西把linux系统的操作直接带入到win10系统 随便启动cmd或powershe
  • 算法设计与分析-分治实验-第二题

    题目 循环赛日程表的设计 设计一个满足以下要求的比赛日程表 n 2k 1 每个选手必须与其他n 1个选手各赛一次 2 每个选手一天只能赛一次 3 循环赛一共进行n 1天 要求 输入选手的数量 需要有效性检查 满足n 2k条件 以矩阵形式输出