循环赛日程安排问题

1.Python语言实现递归和非递归算法,并将日程表存储到Excel中。

# -*- coding:utf-8 -*-



import pprint

import xlwt

import os



# 递归实现

def game_table(x):

    if x == 2:

        return [[1, 2], [2, 1]]

    half = x // 2

    a = game_table(half)

    # 生成表

    t = [[0] * x for _ in range(x)]

    for i in range(half):

        for j in range(half):

            t[i + half][j + half] = t[i][j] = a[i][j]

            t[i][j + half] = t[i + half][j] = a[i][j] + half

    return t



# 非递归实现

def game_table2(x):

    # 表

    t = [[0] * x for _ in range(x)]

    # 初始化

    t[0][0] = 1

    # 生成

    half = 1

    while half < x:

        for i in range(half):

            for j in range(half):

                t[i + half][j] = t[i][j + half] = t[i][j] + half

                t[i + half][j + half] = t[i][j]

        half *= 2



    return t



# 保存为Excel

def save_excel(data, path):

    n = len(data)

    # 创建workbook

    workbook = xlwt.Workbook(encoding='ascii')

    # 创建表

    worksheet = workbook.add_sheet('Output')

    # 写入

    for _i in range(n):

        for _j in range(n):

            # 往单元格内写入内容

            worksheet.write(_i, _j, label=data[_i][_j], style=get_style(data[_i][_j] * 2 + 1))

    # 保存

    workbook.save(path)



# 获取Excel单元格主题

def get_style(num):

    pattern = xlwt.Pattern()

    pattern.pattern = xlwt.Pattern.SOLID_PATTERN

    pattern.pattern_fore_colour = num

    style = xlwt.XFStyle()

    style.pattern = pattern

    return style



# 主函数

def main():

    # Excel保存路径

    xls_path = r'output.xls'

    # 输入k值

    k = int(input('请输入K值:'))

    # 计算n值

    n = 2 ** k

    # 生成循环赛日程表

    ans = game_table2(n)

    # 打印日程表

    print('日程表:')

    pprint.pprint(ans)

    # 保存为Excel

    save_excel(ans, xls_path)

    # 打开Excel

    os.startfile(xls_path)



if __name__ == '__main__':

    main()

2.C++语言实现

#include <iostream>

#include <cmath>

using namespace std;

// 生成日程表

void GameTable(int k, int a[100][100]);

// 打印日程表

void PrintTable(int k, int a[100][100]);

// 主函数

int main() {

    // 日程表数组

    int date[100][100]; 

    int k;

    cout << "请输入K的值:";

    cin >> k;

    cout << "日程表如下:" << endl;

    GameTable(k, date);

    PrintTable(k, date);

    return 0;

}

// 生成日程表

void GameTable(int k, int a[100][100]) {

    // 求解2个选手比赛日程,得到左上角元素

    a[1][1] = 1;

    a[1][2] = 2;

    a[2][1] = 2;

    a[2][2] = 1;

    int n = 2;

    for (int t = 1; t < k; t++) {

        int temp = n;

        n *= 2;

        for (int i = temp + 1; i <= n; i++) {

            for (int j = 1; j <= temp; j++) {

                a[i][j] = a[i - temp][j] + temp;

            }

        }

        // 填右上角元素

        for (int i = 1; i <= temp; i++) {

            for (int j = temp + 1; j <= n; j++) {

                a[i][j] = a[i + temp][(j + temp) % n];

            }

        }

        // 填右下角元素

        for (int i = temp + 1; i <= n; i++)

        {

            for (int j = temp + 1; j <= n; j++)

            {

                a[i][j] = a[i - temp][j - temp];

            }

        }

    }

}

// 打印日程表

void PrintTable(int k, int a[100][100]) {

    double n = pow(2.0, k);

    for (int i = 1; i <= n; i++) {

        for (int j = 1; j <= n; j++) {

            printf("%4d", a[i][j]);

        }

        cout << endl << endl;

    }

}

1.Python实现

输入k为3时,n为8。

日程表被保存在Excel中,如下:

  1. 使用Python的xlwt库,将日程表保存到Excel文件中;
  2. A列为选手列,从B到H列,为第1天到第7天该选手比赛的对手;
  3. 不同选手单元格用不同颜色标注。

2. C++实现

输入k为4时,n为16。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值