タイトルの説明
シングルサイクルゲームをプレイする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;
}