问题描述
设有有2 n(n<=6)个球队进行单循环比赛,计划在2 n – 1天内完成,每个队每天进行一场比赛。设计一个比赛的安排,使在2 n – 1天内每个队都与不同的对手比赛。
输入格式
输入文件matchplan.in共一行,输入n的数值。
输出格式
输出文件matchplan.out共(2 n – 1)行,第i行输出第i天的比赛安排。
格式为:<i> A-B,C-D,……。其中i是天数,A,B分别为比赛双方的编号,每行共2 n-1个比赛场次。
样例输入
2
样例输出
<1>1-2,3-4
<2>1-3,2-4
<3>1-4,2-3
分析:1.根据题意,队伍序号小的的先安排先比赛,每个队伍每天都要比赛
2.每个队伍向后挑选最近队伍比赛,标记今天比过赛了,并标记某两个队伍比过赛~
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
#include <iostream> #include <cstring> #include <cmath> using namespace std; int main() { int n, m, a[1000], mp[10000] = {0}; cin >> n; m = pow(2, n); for (int i = 1; i <= m - 1; i++) { memset(a, 0, sizeof(a)); printf("<%d>", i); for (int j = 1; j <= m; j++) { if (a[j] == 0) { for (int k = j + 1; k <= m; k++) { if (mp[j * 100 + k] == 0 && a[k] == 0) { printf("%d-%d ", j, k); mp[j * 100 + k] = 1; a[j] = a[k] = 1; break; } } } } cout << endl; } return 0; } |
❤ 点击这里 -> 订阅《PAT | 蓝桥 | LeetCode学习路径 & 刷题经验》by 柳婼