JakeLin- [Coupe Blue Bridge] [Formation à l'algorithme VIP] Arrangement de compétition-Résolution de problèmes

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

2 

Exemple 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;
}

 

Publié 20 articles originaux · gagné 15 · vues 217

Je suppose que tu aimes

Origine blog.csdn.net/qq_37414463/article/details/105375244
conseillé
Classement