Description du titre
Il y a 2 ^ n (n <= 6) équipes qui jouent à des parties à cycle unique, qui devraient être terminées dans les 2 ^ n – 1 jours, et chaque équipe joue une partie par jour. Concevez un calendrier de match pour que chaque équipe affronte différents adversaires dans les 2 ^ n – 1 jours.
Entrée
Une ligne, entrez la valeur de n.
Sortie
Il y a un total de (2 ^ n - 1) lignes. La ième ligne affiche le programme du ième jour.
Le format est: <i> AB CD où i est le nombre de jours, A et B sont les nombres des deux côtés du jeu, chaque ligne a un total de 2n-1 matchs.Exemple d'entrée
2Exemple de sortie
<1> 1-2 3-4 <2> 1-3 2-4 <3> 1-4 2-3
Lien du titre d'origine: [Blue Bridge Cup] [Algorithm Training VIP] Arrangement de compétition
Idée:
Prenez n = 3 comme exemple, un total de 8 personnes, 7 jours, puis la première colonne doit être 1 et 7 autres personnes.
Les deux suivants n'ont pas joué par groupes de deux, mais notez que si les deux ont joué il y a quelques jours, ne les arrangez pas pour jouer ensemble, utilisez donc le tableau Viss pour enregistrer qui a joué avec qui .
[Adoptez l'idée d'une traversée de liste chaînée, mais jugez directement ici]
Description de deux variables de tableau vis:
Le nom | Effet |
---|---|
vis [100] | Tout au long de la ligne , vis [j] indique que j a été touché ce jour, veuillez ne pas l'arranger |
tout [100] | Tout au long du programme , viss [i] [j] indique que "ij" a été touché, veuillez ne pas les organiser ensemble ci-dessous |
Code attaché:
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
using namespace std;
int vis[100];
int viss[100][100];
int main(){
int n;
cin>>n;
int per = pow(2,n);
int day = pow(2,n)-1;
for(int i=1;i<=day;i++){
memset(vis,0,sizeof(vis));
cout<<"<"<<i<<">";
int p=1;
while(p<=per){
if(vis[p]==1){ //找出第一个还没打过的p
p++;
continue;
}
int tmp=p;
for(int q=p+1;q<=per;q++){ //判断谁和p打:找出q
if(vis[q]==0 && viss[p][q]==0){ //如果他们之前没打过
vis[p]=vis[q]=viss[p][q]=1;
cout<<p<<"-"<<q<<" ";
p=tmp+1; //判断下一个人p
break;
}
}
}
cout<<endl;
}
return 0;
}