产生冠军

题目描述

有一群人,打乒乓球比赛,两两捉对撕杀,每两个人之间最多打一场比赛。
球赛的规则如下:
如果A打败了B,B又打败了C,而A与C之间没有进行过比赛,那么就认定,A一定能打败C。
如果A打败了B,B又打败了C,而且,C又打败了A,那么A、B、C三者都不可能成为冠军。
根据这个规则,无需循环较量,或许就能确定冠军。你的任务就是面对一群比赛选手,在经过了若干场撕杀之后,确定是否已经实际上产生了冠军。
 

输入

输入含有一些选手群,每群选手都以一个整数n(n<1000)开头,后跟n对选手的比赛结果,比赛结果以一对选手名字(中间隔一空格)表示,前者战胜后者。如果n为0,则表示输入结束。
 

输出

对于每个选手群,若你判断出产生了冠军,则在一行中输出“Yes”,否则在一行中输出“No”。
 

样例输入

3
Alice Bob
Smith John
Alice Smith
5
a c
c d
d e
b e
a d
0

样例输出

Yes
No
这个题是从网上借鉴的方法,
方法是 左边是胜利 右边是失败 看左边的 在不在右边 如果不在并且只有一名胜利者 那么就可以 ,否则不可以
记住  比较字符串  一定用strcmp;
用二维字符串 输入多次字符串;
字符串输入不带指针&是因为他本事就是首地址;

#include<stdio.h> #include<string.h> int main() { int n,m,d,e,i,j,k,p; char a[10000][100],b[1000][1000]; int c[1000],s[1000]; while(scanf("%d",&n)&&n)//这样是为了可以输入零结束。 { k=0; memset(c,0,sizeof(c));//因为又多次循环 所以要初始化数组; memset(s,0,sizeof(s)); for(i=0;i<n;i++) { scanf("%s%s",a[i],b[i]);//输入;定义C里面的值全为1; c[i]=1; } for(i=0;i<n;i++) { for(j=0;j<n;j++) { if(strcmp(a[i],b[j])==0)//如果相等的话 把那个C[i]=0; { c[i]=0; } } } for(i=0;i<n;i++) { if(c[i]==1) { s[k++]=i;//找出c[i]为一的下坐标存到另一个数组里。 } } p=1; for(i=1;i<k;i++) { if(strcmp(a[s[i]],a[s[i-1]])==0)//用坐标为s[K]的a[s[k]]值进行比较 如果相等就个数加一 p++;// } if(p==k)//与得到的K 进行比较 如果相等就代表只有一个人 输出YES { printf("Yes");} else//否则输出NO; { printf("No"); } } }



原文地址:https://www.cnblogs.com/zhangjiaqi123/p/6184637.html