/****************************************************************************/ /* Torneos Round-Robin. */ /* */ /* Se enfrentan n equipos entre si, deben jugar todos contra todos. */ /* Solo es posible si n es par, así que en el caso impar se introduce */ /* un equipo ficticio de modo que el que debería jugar con el, descansa */ /* esa ronda. */ /* En la ronda k el equipo i<n jugará con el j<n si i+j = k mod n donde */ /* j es distinto de i. Cuando i=j, es decir que 2i = k mod n, el equipo i */ /* juega contra el n. */ /* */ /* Ref: Rosen, Elementary number theory and its applications. */ /* */ /* Jaime Suarez <mcripto@bigfoot.com> 2003 */ /* en http://elparaiso.mat.uned.es */ /****************************************************************************/ #include <stdio.h> #include <stdlib.h> void uso(void); int main(int argc, char *argv[]) { unsigned int n,i,j,tmp, ronda, N; if (argc<2) { uso(); return 1; } n=atoi(argv[1]); if (n>=17 || n<2) { uso(); return 1; } if (n & 1) N=n+1; else N=n; printf(" Equipo -->"); for (i=1; i<=n; i++) printf(" %2d ",i); printf("\n"); for (ronda=1; ronda<N; ronda++) { printf(" Ronda %2d: ",ronda); for (i=1; i<N; i++) { for (j=1; j<N; j++) { if ( (i+j)%(N-1)== ronda%(N-1)) break; } if (j==i && N!=n) printf(" - "); else if (j==i && N==n) {printf(" %2d ",n); tmp=i;} else printf(" %2d ",j); } if (N==n) printf(" %2d ",tmp); printf("\n"); } return 0; } void uso(void) { printf("Uso: rndrobin <n>\n"); printf("Calcula las rondas para un torneo con n (1<n<17) equipos.\n"); return ; }