1.题目:
2.思路:
设一个一维数组来记录这个队在这一天是否有比赛;设一个二维数组记录这两个队在这一天是否对决过;
3.代码:
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
bool f[100][100];//记录某两个队已经比赛过
bool vis[100];//记录某天有没有被安排比赛
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<pow(2,n);i++)
{
printf("<%d>",i);
memset(vis,0,sizeof(vis));//每天的比赛都要重新安排,所以每次数组都要初始化;
for(int k=1;k<=pow(2,n);k++)
if(!vis[k])//判断第k队有没有安排比赛,!vis[k]表示vis[k]==0;
{
vis[k]=1;//给第k对安排比赛
for(int j=k+1;j<=pow(2,n);j++)
if(!vis[j]&&!f[k][j])//如果没给第j队安排比赛(vis[j]==0)并且第k队没和第j
//队比赛过(f[k][j]==0);
{
vis[j]=1;//给第j队安排比赛
f[k][j]=1;//安排第k队与第j队的比赛
if(k!=1) cout<<",";//按题目要求;
printf("%d-%d",k,j);//安排比赛之后输出这两队
break;//第k队安排完之后,这一天就不再安排第k队的比赛,直接退出循环
}
}
cout<<endl;//每一天安排完之后换行;
}
return 0;
}