二分策略递归算法:

def schedule(n): if n == 1: return [[0]] else: sub_schedule = schedule(n//2) schedule_table = [[0 for i in range(n-1)] for j in range(n)] for i in range(n): for j in range(n//2): schedule_table[i][j] = sub_schedule[i][j] schedule_table[i][j+(n//2)] = (sub_schedule[i][j]+(n//2)) % (n-1) schedule_table[i][(n-2)-j] = (sub_schedule[i][(j+(n//2)-1) % (n-1)]+(n//2)) % (n-1) schedule_table[i][n-2] = n-1 return schedule_table

测试

n = 8 schedule_table = schedule(n) print("比赛日程表:") for i in range(n): print(schedule_table[i])

输出: 比赛日程表: [0, 1, 2, 3, 4, 5, 6] [1, 0, 3, 2, 5, 4, 7] [2, 3, 0, 1, 6, 7, 4] [3, 2, 1, 0, 7, 6, 5] [4, 5, 6, 7, 0, 1, 2] [5, 4, 7, 6, 1, 0, 3] [6, 7, 4, 5, 2, 3, 0] [7, 6, 5, 4, 3, 2, 1]

二分策略非递归算法:

def schedule(n): if n == 1: return [[0]] else: schedule_table = [[0 for i in range(n-1)] for j in range(n)] sub_n = 1 while sub_n < n: for i in range(sub_n): for j in range(sub_n//2): for k in range(sub_n//2): schedule_table[i+jsub_n2+k][sub_n-1] = i+ksub_n2+jsub_n schedule_table[i+ksub_n2+jsub_n][sub_n-1] = i+jsub_n2+k*sub_n sub_n *= 2 return schedule_table

测试

n = 8 schedule_table = schedule(n) print("比赛日程表:") for i in range(n): print(schedule_table[i])

输出: 比赛日程表: [0, 1, 2, 3, 4, 5, 6] [1, 0, 3, 2, 5, 4, 7] [2, 3, 0, 1, 6, 7, 4] [3, 2, 1, 0, 7, 6, 5] [4, 5, 6, 7, 0, 1, 2] [5, 4, 7, 6, 1, 0, 3] [6, 7, 4, 5, 2, 3, 0] [7, 6, 5, 4, 3, 2, 1]

利用数据间的规律构造算法:

def schedule(n): if n == 1: return [[0]] else: schedule_table = [[0 for i in range(n-1)] for j in range(n)] for i in range(n): for j in range(n-1): schedule_table[i][j] = (i+j) % (n-1) if i+j >= n-1: schedule_table[i][j] += 1 return schedule_table

测试

n = 8 schedule_table = schedule(n) print("比赛日程表:") for i in range(n): print(schedule_table[i])

输出: 比赛日程表: [0, 1, 2, 3, 4, 5, 6] [1, 0, 3, 2, 5, 4, 7] [2, 3, 0, 1, 6, 7, 4] [3, 2, 1, 0, 7, 6, 5] [4, 5, 6, 7, 0, 1, 2] [5, 4, 7, 6, 1, 0, 3] [6, 7, 4, 5, 2, 3, 0] [7, 6, 5, 4, 3, 2, 1]

二维递推算法:

def schedule(n): schedule_table = [[0 for i in range(n-1)] for j in range(n)] for i in range(n): schedule_table[i][0] = i for j in range(1, n-1): if j % 2 == 1: for i in range(n): schedule_table[i][j] = schedule_table[i][(j-1)//2] else: for i in range(n): schedule_table[i][j] = (schedule_table[i][j-1]+(n//2)) % (n-1) if schedule_table[i][j] >= i: schedule_table[i][j] += 1 return schedule_table

测试

n = 8 schedule_table = schedule(n) print("比赛日程表:") for i in range(n): print(schedule_table[i])

输出: 比赛日程表: [0, 1, 2, 3, 4, 5, 6] [1, 0, 3, 2, 5, 4, 7] [2, 3, 0, 1, 6, 7, 4] [3, 2, 1, 0, 7, 6, 5] [4, 5, 6, 7, 0, 1, 2] [5, 4, 7, 6, 1, 0, 3] [6, 7, 4, 5, 2, 3, 0] [7, 6, 5, 4, 3, 2, 1

设有n=2^k个运动员要进行网球循环赛现要设计一个满足以下要求的比赛日程表。1每个选手必须与其他n-1个选手各赛一次;2每个选手一天只能参赛一次;3循环赛在n-1天内结束请按此要求将比赛日程表设计成有n行和n-1列的一个表。在表中的第i行第j列处填入第i个选手在第j天所遇到的选手其中1≤i≤n1≤j≤n-1分别用二分策略递归算法、二分策略非递归算法、利用数据间的规律构造算法和二维递推算法来设计算法

原文地址: http://www.cveoy.top/t/topic/eSvg 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录