JakeLin- [Blue Bridge Cup] [Algorithm Training VIP]コンテストの手配-問題解決

タイトルの説明

シングルサイクルゲームをプレイする2 ^ n(n <= 6)チームがあり、2 ^ n–1日以内に完了する予定で、各チームは毎日1つのゲームをプレイします。各チームが2 ^ n–1日以内に異なる対戦相手と競争するように、ゲームのスケジュールを設計します。 

入力

行、nの値を入力します。 

アウトプット

合計(2 ^ n – 1)行あり、i行目はi日目のスケジュールを出力します。 
形式は次のとおりです。<i> AB CDここで、iは日数、AとBはゲームの2つの面の番号、各行は合計で2n-1一致します。 

入力例

2 

出力例

<1> 1-2 3-4 
<2> 1-3 2-4 
<3> 1-4 2-3 

元のタイトルのリンク:[Blue Bridge Cup] [Algorithm Training VIP] Competition Arrangement

アイデア:
例としてn = 3、合計8人、7日とすると、最初の列は1人と他の7人でなければなりません。
次の2つは2つのグループでプレイしていませんが、2人が数日前にプレイした場合、一緒にプレイするように手配しないでください。viss配列を使用して、誰が誰とプレイしたかを記録します。
[リンクリストトラバーサルのアイデアを採用しますが、ここで直接判断します]

2つのvis配列変数の説明:

名前 効果
vis [100] 行全体で、vis [j]は、jがこの日にヒットしたことを示しています。アレンジしないでください。
すべて[100] プログラム全体を通して、viss [i] [j]は「ij」がヒットしたことを示しています。下に一緒に配置しないでください

 添付コード:

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

 

元の記事を20件公開 15 獲得 ビュー217

おすすめ

転載: blog.csdn.net/qq_37414463/article/details/105375244