//首先这是C语言打的,如果有错的地方可以交流交流
問題の説明
卓球をし、お互いを捕まえて殺し合う人々のグループがあり、2人に1回のゲームがあります。
ゲームのルールは次のとおりです
。AがBを打ち、BがCを再び打ち、AとCの間に一致がない場合、AはCを打ち負かす必要があると判断されます。
AがBに勝ち、BがCに再び勝ち、CがAに再び勝った場合、A、B、およびCはチャンピオンになることはできません。
このルールによれば、コンテストを繰り返すことなくチャンピオンを決定できる場合があります。あなたの仕事は、競技者のグループと向き合い、数回の殺害の後、チャンピオンシップが実際に行われたかどうかを判断することです。
入力に
はいくつかのプレーヤーグループが含まれます。プレーヤーの各グループは整数n(n <1000)で始まり、nペアのプレーヤーの一致結果が続きます。一致結果はプレーヤー名のペア(間にスペースを入れて)で表されます。 。前者は後者を打ち負かします。nが0の場合、入力の終わりを意味します。
出力
各プレイヤーグループについて、チャンピオンが作成されたと判断した場合は1行に「はい」を出力し、そうでない場合は1行に「いいえ」を出力します。
サンプル入力
3
アリスボブ
・スミスジョン・
アリス・スミス
5
交流
CD
デ
BE
広告
0
サンプル出力
はい
いいえ
分析
最初に、2つの文字列配列aとbを定義できます。次に、aがb配列に表示されるかどうかを判断します。これはaとbの2つのセットに相当します。aにbの最初に来ない人が1人しかいない場合にのみ、それらが勝ちます。
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#define N 1005
char a[N][100],b[N][100];
int c[N],d[N];
int main()
{
int n;
while(~scanf("%d",&n)&&n!=0)
{
memset(c,0,sizeof(c));
int i,j,flag=1,k=0;
for(i=0;i<n;i++)
{
scanf("%s",a[i]);
getchar();
scanf("%s",b[i]);
c[i]=1;//假设每次都有一组赢,表示为c数组中为1
}
for(i=0;i<n;i++)//两个游标遍历a和b
for(j=0;j<n;j++)
if(strcmp(a[i],b[j])==0) c[i]=0;//如果b中出现a,
//则这组C为0,表示输
for(i=0;i<n;i++)
if(c[i]==1) d[k++]=i;//用d来存为1的情况;
for(i=1;i<k;i++)//如果d存的下标在a中都相等,
//就表示只有一个人赢,且为同一人;
if(strcmp(a[d[i]],a[d[i-1]])==0) flag++;
if(flag==k)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}