问题描述:
设有n个选手进行循环比赛,其中n = 2m,要求每名选手要与其余n-1名选手都赛一次,每名选手天天比赛一次,循环赛共进行n - 1天,要求天天没有选手轮空。c++输入格式
一个正整数m(2 <= n <= 6)算法输出格式spa
样例形式的比赛安排表code
样例输入:ip
3ci
样例输出:it
1 2 3 4 5 6 7 8class
2 1 4 3 6 5 8 7循环
4 3 2 1 8 7 6 5di
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
起初是看不大懂样例的,后来水哲告诉我看懂样例就能作出来了。我约莫看懂样例表述的含义后,恍然发现算法其实和他的含义没有任蛤关系。
这个图事实上是中心对称。而且每个子方块都知足中心对称,由此能够填出一半复制出另外一半。而且,在结构上右侧的正方形与左侧在相对结构上是彻底相同的(每一个位置+a)。
那么只要每次拓展出右侧矩阵,在中心对称便可。话说题目给了2^n彷佛在暗示两分处理。
#include <bits/stdc++.h> using namespace std; int n, m; int match[110][110]; int mid = 1, k = 1; int main(){ freopen("match.in","r",stdin); freopen("match.out","w",stdout); cin >> m; n = 1 << m; match[1][1] = 1; do { for (int i = 1; i <= mid; i++) for (int j = 1; j <= mid; j++) { match[i][j + mid] = match[i][j] + mid; } for (int i = 1; i <= mid; i++) for (int j = 1; j <= mid; j++) { match[i + mid][j] = match[i][j + mid]; match[i + mid][j + mid] = match[i][j]; } k ++; mid *= 2; } while (k <= m); for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) cout << match[i][j] << " "; cout << endl; } return 0; }