hdu2094 lenguaje c

//首先这是C语言打的,如果有错的地方可以交流交流

Descripción del problema
Hay un grupo de personas que juegan al tenis de mesa, se atrapan y se matan entre sí, como máximo un juego entre cada dos personas.
Las reglas del juego son las siguientes:
si A vence a B y B vence a C nuevamente, y no hay coincidencia entre A y C, entonces se determina que A debe vencer a C.
Si A vence a B, B vence a C nuevamente y C vence a A nuevamente, entonces A, B y C no pueden convertirse en campeones.
De acuerdo con esta regla, es posible que pueda determinar el campeón sin concursos recurrentes. Tu tarea es enfrentarte a un grupo de concursantes y, después de varias rondas de asesinatos, determinar si realmente se ha producido un campeonato.

La entrada
contiene algunos grupos de jugadores. Cada grupo de jugadores comienza con un número entero n (n <1000), seguido del resultado del partido de n pares de jugadores. El resultado del partido está representado por un par de nombres de jugadores (con un espacio entre ellos) El primero derrota al segundo. Si n es 0, significa el final de la entrada.

Salida
Para cada grupo de jugadores, si determina que se produce un campeón, escriba "Sí" en una línea, de lo contrario, escriba "No" en una línea.

Entrada de muestra
3
Alice Bob
Smith John
Alice Smith
5
ac
cd
de
be
ad
0

Salida de muestra

No

Análisis
Primero puede definir dos matrices de cadenas ay b. Luego juzgue si a aparece en la matriz b; es equivalente a dos conjuntos de ayb; solo si hay solo una persona en a que no es la primera en b, ganan.

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


Supongo que te gusta

Origin blog.csdn.net/qq_51763206/article/details/113098543
Recomendado
Clasificación