题目是这样的
1、 设有n个球队要进行排球循环赛,设计一个满足以下要求的比赛日程表:
a) 每个球队必须与其他n-1个球队各赛一次;
b) 每个球队一天只能赛一次;
c) 当n是偶数时,循环赛进行n-1天。当n是奇数时,循环赛进行n天。
n=6的比赛日程表示例(把6个队从1到6进行编号):
分析一下:
假设n为偶数,一共得比赛场次是(n*(n-1))/2 ,每天最多比赛 n/2场.所以一共需要比赛n-1天。
n为奇数时,可以补0,添加为偶数。 与0匹配的时表示轮空。
网上的思路:

思路是 1位置保持不动,其余几位逆时针旋转,一共旋转n-1次。这样可以保证,每天每人 比赛一次。且不重复。
---
1 4
2 5
3 6
---
1 5
4 6
2 3
---
1 6
5 3
4 2
---
1 3
6 2
5 4
----
1 2
3 4
6 5
C++实现如下:
#include<stdio.h>
#include<string.h>
#include <vector>
using namespace std;
int main()
{
std::vector<int>a;
int n;
scanf("%d",&n);
for(int i = 0; i < n; i++)
{
a.push_back(i+1);
}
if(a.size() % 2)
a.push_back(0);
n = a.size();
int mid = n/2;
int s1[35],s2[35];
if(n<=2) return 0;
for(int i = 0; i < mid; i++)
{
s1[i] = a[i];
s2[i] = a[i+mid];
}
for(int i = 0; i < n-1; i++)
{
printf("day =============%d
",i+1);
for(int j = 0; j < mid; j++)
{
printf("%d %d
",s1[j],s2[j]);
}
int tmp = s1[1];
for(int j = 1;j < mid-1; j++)
{
s1[j] = s1[j+1];
}
s1[mid-1] = s2[mid-1];
for(int j = mid-1;j >= 1; j--)
{
s2[j] = s2[j-1];
}
s2[0] = tmp;
}
return 0;
}