admin 管理员组

文章数量: 1087817

PTA 6 循环日程表

问题:
设有N个选手进行循环比赛,其中N=2^​M ,要求每名选手要与其他N−1名选手都赛一次,每名选手每天比赛一次,循环赛共进行N−1天,要求每天没有选手轮空。

输入格式:
输入:M(M<=7)。

输出格式:
输出:表格形式的比赛安排表。一行各数据间用一个空格隔开。

输入样例:
3
输出样例:
在这里给出相应的输出。例如:

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

说明,第一行为:1 2 3 4 5 6 7 8,1表示本行都是1号选手和其他选手的比赛,如第2个数为2(其下标可以看成1)表示第一天1号和2号比赛,第5个数为5(其下标可以看成4),表示1号和5号在第4天比赛。

分析:


源代码:

#include <iostream>
#include <math.h>
using namespace std;
#define N 128//递归函数 
void arrange(int p, int q, int t, int arr[N][N]) {//规格为4及以上,它的左上角和右上角要递归if (t >= 4) {arrange(p, q, t / 2, arr);arrange(p, q + t / 2, t / 2, arr);}//填左下角for (int i = p + t / 2; i < p + t; i++) {for (int j = q; j < q + t / 2; j++) {arr[i][j] = arr[i - t / 2][j + t / 2];}}//填右下角 for (int i = p + t / 2; i < p + t; i++) {for (int j = q + t / 2; j < q + t; j++) {arr[i][j] = arr[i - t / 2][j - t / 2];}}}int main() {int n,m;int arr[N][N];cin >> m;n =(int) pow (2, m);//2的m次方//初始化第一行for (int i = 0; i < n; i++) {arr[0][i] = i + 1;  }//递归 arrange(0, 0, n, arr);//打印输出循环赛日程表 for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {cout << arr[i][j] << " ";}cout << endl;}return 0;
}

本文标签: PTA 6 循环日程表