BNU1068:比赛安排

BNU ACM/ICPC队的队员在训练之余,常常会举办一些娱乐性的比赛,这些比赛通常都很受大家欢迎。近期,在领队的带领下,1 VS 1取石子大赛又要开始了。在安排日程表时,需要考虑以下两个要求:
1、每个人每天最多只能参加一场比赛,可以不参加。
2、在大赛结束后,任意两人间都恰好进行了一场对决。
由于时间有限,我们希望比赛天数尽可能少,请聪明的你帮忙给出对阵方案。

Input

输入包含多组数据。
输入第一行:一个整数t ≤ 50表示测试数据的组数。
每组数据一行包含一个整数2 < n ≤ 100,表明有n个队员参加比赛,且编号为1——n。

Output

对于每组数据,输出的第一行为一个整数m,表示比赛进行需要的最少天数;接下来m行,依次输出从第一天到第m天的比赛对阵情况,一天一行。
具体输出格式请参照样例。每行末尾不要输出多余的空格。
如果有多种安排方法,输出任意一个即可。
每组答案后面保留一个空行。

Sample Input

2
3
4

Sample Output

3
1vs2
2vs3
3vs1

3
1vs2 3vs4
1vs3 2vs4
1vs4 2vs3

 
这题其实换个思路也就很简单了
假如1~50
我们让1vs50,2vs49…
然后将2移到末尾
1,3,4~50,2
这里就是
1vs2 3vs50 4vs49
通过循环移位就能将每个人安排比赛了
 
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;

int a[105];

int main()
{
    int t,n,i,j,m;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        m = n;
        if(n%2)
            m++;
        printf("%d\n",m-1);
        for(i = 0; i<m; i++)
            a[i] = i+1;
        for(i = 1; i<m; i++)
        {
            int flag = 1;
            for(j = 0; j<m/2; j++)
            {
                if(a[j]<=n && a[m-1-j]<=n)
                {
                    if(flag)
                    {
                        flag = 0;
                        printf("%dvs%d",a[j],a[m-1-j]);
                    }
                    else
                        printf(" %dvs%d",a[j],a[m-1-j]);
                }

            }
            printf("\n");
            int tem = a[1];
            for(j = 1; j<m; j++)//后移
                a[j] = a[j+1];
            a[m-1] = tem;
        }
        printf("\n");
    }

    return 0;
}

你可能感兴趣的:(水,BNU)