问题描述
设有有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个比赛场次。
格式为:<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
<2>1-3,2-4
<3>1-4,2-3
样例输出的描述错了,逗号应该是空格。评测数据的正确输出格式如下:
不会做,参考自https://blog.csdn.net/qq_34845121/article/details/60957163
1 #include <bits/stdc++.h> 2 using namespace std; 3 int a[70][70]; //a[i][j]记录队伍i和队伍j是否比赛过了 4 int v[70]; //v[i]记录队伍i该天是否比赛过了 5 int main() { 6 int n; 7 cin >> n; 8 int len = 1; 9 for (int i = 1; i <= n; i++) { 10 len *= 2; //len=队伍数2^n 11 } 12 for (int i = 0; i < len - 1; i++) { //比赛天数2^n-1,也就是要输出的行数 13 printf("<%d>", i + 1); //输出天数 14 memset(v, 0, sizeof v); //重置(新的一天每个队伍都是没有比过赛的) 15 for (int j = 0; j < len / 2; j++) { //每天n场,就是每行要输出几次比赛 16 for (int k = 1; k <= len; k++) { //遍历所有队伍,找第一个参赛的队伍 17 if (v[k] == 1) { //如果该天该队伍已经比赛过来,跳过 18 continue; 19 } 20 int judge = 0; //判断k,h这两个队伍有没有比赛过 21 for (int h = 1; h <= len; h++) { //遍历所有队伍,找第二个参赛的队伍 22 if (k == h) { //自己不能和自己比较 23 continue; 24 } 25 if (v[h] == 1) { //如果该天该队伍已经比赛过来,跳过 26 continue; 27 } 28 if (a[k][h] == 0 && a[h][k] == 0) { //h,k两队伍该天是否有一起比赛 29 printf("%d-%d ", k, h); //队伍k和队伍h比赛了 30 v[h] = 1; //标记h队伍今天不再比赛比赛 31 v[k] = 1; //标记k队伍今天不再比赛比赛 32 a[k][h] = 1; //标记h和k今天已经比赛 33 judge = 1; //标记第j场结束,跳到下一场 34 break; 35 } 36 } 37 if (judge == 1) { //第j场结束,跳到下一场 38 break; 39 } 40 } 41 } 42 printf(" "); 43 } 44 return 0; 45 }