算法训练 比赛安排

来源:互联网 发布:一级国家域名列举 编辑:程序博客网 时间:2024/04/19 14:14

  算法训练 比赛安排  
时间限制:1.0s   内存限制:512.0MB
    
问题描述
  设有有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


问题分析:题目不难,用一个二位数组标志队伍i和j是否对战过,再用cur,op来记录每天的比赛已经比赛的队伍和配对的对手但是坑爹的是……输出的时候题目里明明是逗号,但是样例里的输出中间确实空格……


#include<cstdio>#include<cstring>#include<cmath>#include<string>#include<vector>#include<iostream>using namespace std;int team[70][70];//表示与队伍i已经对战过的队伍 int cur[70];//表示当前已经对战过的队伍int op[35][2];int n; int main(){cin >> n;int num = pow(2,n);memset(team,0,sizeof(team));for(int i=1; i<=num-1; i++)//表示第i场比赛 {memset(cur,0,sizeof(cur));memset(op,0,sizeof(op));int t = 0; for(int j=1; j<=num; j++)//表示第j支队伍 {if (cur[j] == 0)//如果这支队伍没有对手,配对 {cur[j] = 1;for(int k=1; k<=num; k++)//k表示配对的对手 {if (j == k || cur[k] == 1)//如果队伍k已经参与其他比赛,跳过 continue;if (team[j][k] == 0 && cur[k] == 0)//如果队伍j与k没有对战过,配对 {team[j][k] = 1;cur[k] = 1;op[t][0] = j;op[t++][1] = k;break;}}}}printf("<%d>",i);for(int i=0; i<t; i++)printf("%d-%d%c",op[i][0],op[i][1],i==t-1?10:32);}return 0;}





0 0
原创粉丝点击