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中,如下:
- 使用Python的xlwt库,将日程表保存到Excel文件中;
- A列为选手列,从B到H列,为第1天到第7天该选手比赛的对手;
- 不同选手单元格用不同颜色标注。
2. C++实现
输入k为4时,n为16。