El sistema de todos contra todos o sistema de liga es un sistema de torneos de competición, generalmente deportiva, en que cada participante o equipo del torneo se enfrenta contra todos los demás en eventos o juegos que involucran una competencia de pares, es decir un equipo contra otro equipo, y en un número constante de oportunidades (habitualmente una o dos).Webster's Third New International Dictionary of the English Language, Unabridged (1971, G. & C. Merriam Co), p.1980.
Este tipo de competición también se llama liguilla o round-robin. Un torneo de todos contra todos puede adoptar un nombre particular según la cantidad de participantes, como triangular, cuadrangular, pentagonal, hexagonal, etc.
Se diferencia del torneo de eliminación, donde el perdedor no participa más y el ganador pasa a una siguiente fase; en el sistema de liga el perdedor sigue participando hasta jugar contra todos los competidores.
Este tipo de torneo se utiliza habitualmente en las ligas nacionales de deportes de pelota como baloncesto, béisbol, fútbol, tenis y rugby, donde varios equipos se enfrentan en temporadas de medio año o de año completo.
En algunas copas internacionales importantes, como la Copa Mundial de Fútbol, la Copa América, la Eurocopa, la Liga de Campeones de la UEFA y la Copa Libertadores de América, se emplea un sistema de dos fases. En una primera etapa, los equipos se dividen en grupos de pocos integrantes, generalmente cuatro, que se enfrentan todos contra todos. Los mejores de cada grupo pasan a la segunda etapa, que es de eliminación directa.
Desventajas del método Una desventaja, en especial cuando hay pocos competidores, es el «círculo de la muerte», donde los equipos quedan empatados en una puntuación de mayor a menor. En un round-robin de tres equipos donde A derrota a B, B derrota a C, y C derrota a A, los tres competidores tuvieron un récord de una victoria y una derrota y se necesitará un método de romper el empate.
Criterios de clasificación Los participantes de un torneo de este tipo en general se clasifican en tablas para poder valorar su actuación. Se aplican diversos criterios, de acuerdo con los resultados, que aplican una puntuación a cada uno de los competidores. En el caso del fútbol, cada victoria otorga 3 puntos, 1 por cada empate y 0 por derrota. Este sistema se adoptó gradualmente en los años 1980 y 1990 y sustituyó al antiguo sistema de dos puntos por victoria y uno por empate.
En muchas ocasiones, especialmente en torneos con pocos participantes, la puntuación no basta para determinar todas las posiciones, por lo que se usan diversos criterios de desempate, que varían en cada torneo. Lo más habitual es considerar los goles marcados y recibidos, en distintas combinaciones.
La Copa Mundial de Fútbol, el principal torneo de selecciones nacionales de fútbol, utiliza los siguientes patrones de desempate en caso de que dos o más equipos terminen con la misma cantidad de puntos:
Mayor diferencia de goles. Mayor número de goles anotados. Mayor número de puntos obtenidos en los partidos disputados entre los equipos empatados. Mayor diferencia de goles en los partidos disputados entre los equipos empatados. Mayor número de goles anotados en los partidos disputados entre los equipos empatados. Sorteo del comité organizador.
Un ejemplo del sistema de clasificación es el siguiente, que corresponde al Grupo B de la Copa Mundial de Fútbol de 1998. se clasificó en el primer lugar al ganar dos de sus tres partidos y empatar un tercero, mientras alcanzó tres puntos por tres empates. quedó tercera pues, aunque tenía igual puntuación que , contaba con una mejor diferencia de goles (–1 contra –3).
EquipoPtsPTGEPGFGCDG20px|Bandera de Italia 7321073420px|Bandera de Chile 3303044020px|Bandera de Austria 2302134-120px|Bandera de Camerún 2302125-32:21:11:13:02:11:1
Algoritmos de selección Si es el número de competidores, una ronda simple de este sistema requiere encuentros. Si es un número par, entonces en rondas, se pueden jugar partidos simultáneamente. Si es impar, habrá rondas con juegos simultáneos y un equipo libre (sin jugar) en cada ronda.
Para determinar el calendario del torneo, se realiza un simple algoritmo de selección. A cada uno de los competidores se le asigna un número y se van rotando los números, dejando uno fijo. Por ejemplo, en un torneo con 14 equipos:
1.ª ronda: (1 contra 14, 2 contra 13, … ) 1 2 3 4 5 6 7 14 13 12 11 10 9 8
2.ª ronda: (1 contra 13, 14 contra 12, … ) 1 14 2 3 4 5 6 13 12 11 10 9 8 7
3.ª ronda: (1 contra 12, 13 contra 11, … ) 1 13 14 2 3 4 5 12 11 10 9 8 7 6
…
13.ª ronda: (1 contra 2, 3 contra 14, … ) 1 3 4 5 6 7 8 2 14 13 12 11 10 9
Si hay un número impar, se puede asignar un número especial para totalizar los pares con el fin de establecer el equipo que quedará libre. Para dobles rondas, simplemente se repite el sistema anterior, pero se alternan las localías.
Elaboración de fixture Un fixture es una tabla de emparejamientos de equipos o jugadores en un torneo por sistema de todos contra todos.
Para elaborarlo manualmente, se tiene en cuenta que la cantidad de rondas es igual al número de participantes menos 1, y la cantidad de enfrentamientos por ronda es igual a la mitad del número de participantes. Por ejemplo, un torneo de ocho participantes requiere siete rondas y cuatro enfrentamientos por ronda.
En este ejemplo de torneo con ocho participantes, se crea una tabla de siete filas (rondas) por cuatro columnas (juegos o partidas). La tabla se comienza escribiendo sucesivamente y hasta el final los números de los participantes hasta el impar más alto; es decir, que en este ejemplo se escriben los números del 1 al 7, hasta completar las siete filas. Ronda Partida 1 Partida 2 Partida 3 Partida 4 1.ª 1 2 3 4 2.ª 5 6 7 1 3.ª 2 3 4 5 4.ª 6 7 1 2 5.ª 3 4 5 6 6.ª 7 1 2 3 7.ª 4 5 6 7 A continuación, si el número de participantes es par, ese número se escribe alternativamente a derecha e izquierda del número de la primera columna (si el número de participantes es impar, no se escribe y el participante de la primera columna queda libre en la ronda correspondiente): Ronda Partida 1 Partida 2 Partida 3 Partida 4 1.ª 1-8 2 3 4 2.ª 8-5 6 7 1 3.ª 2-8 3 4 5 4.ª 8-6 7 1 2 5.ª 3-8 4 5 6 6.ª 8-7 1 2 3 7.ª 4-8 5 6 7
Por último, se completan los emparejamientos por filas y columnas escribiendo hacia abajo y sucesivamente los números faltantes, empezando por el impar más alto:
Ronda Partida 1 Partida 2 Partida 3 Partida 4 1.ª 1-8 2-7 3-6 4-5 2.ª 8-5 6-4 7-3 1-2 3.ª 2-8 3-1 4-7 5-6 4.ª 8-6 7-5 1-4 2-3 5.ª 3-8 4-2 5-1 6-7 6.ª 8-7 1-6 2-5 3-4 7.ª 4-8 5-3 6-2 7-1
El primer número en cada enfrentamiento tendrá la prioridad correspondiente (la condición de local, las piezas blancas en ajedrez, etc.). En caso de ser un torneo a doble vuelta, en la segunda se invierten los números de cada juego.
Algoritmos de programación
Fixture // Cálculo de liga usando algoritmo fixture
package generaliga;
public class Liga { static public class Partido
public int local = -1, visitante = -1;
private static Partido[][] calcularLigaNumEquiposPar(int numEquipos)
int numRondas = numEquipos - 1; int numPartidosPorRonda = numEquipos / 2;
Partido[][] rondas = new Partido[numRondas][numPartidosPorRonda];
for (int i = 0, k = 0; i < numRondas; i ++)
for (int j = 0; j < numPartidosPorRonda; j ++)
rondas[i][j] = new Partido();
rondas[i][j].local = k;
k ++;
if (k == numRondas) k = 0;
for (int i = 0; i < numRondas; i ++)
if (i % 2 == 0)
rondas[i].visitante = numEquipos - 1;
else
rondas[i].visitante = rondas[i].local; rondas[i].local = numEquipos - 1;
int equipoMasAlto = numEquipos - 1; int equipoImparMasAlto = equipoMasAlto - 1;
for (int i = 0, k = equipoImparMasAlto; i < numRondas; i ++)
for (int j = 1; j < numPartidosPorRonda; j ++)
rondas[i][j].visitante = k;
k --;
if (k == -1) k = equipoImparMasAlto;
return rondas;
private static Partido[][] calcularLigaNumEquiposImpar(int numEquipos)
int numRondas = numEquipos; int numPartidosPorRonda = numEquipos / 2;
Partido[][] rondas = new Partido[numRondas][numPartidosPorRonda];
for (int i = 0, k = 0; i < numRondas; i ++)
for (int j = -1; j < numPartidosPorRonda; j ++)
if (j >= 0)
rondas[i][j] = new Partido();
rondas[i][j].local = k;
k ++;
if (k == numRondas) k = 0;
int equipoMasAlto = numEquipos - 1;
for (int i = 0, k = equipoMasAlto; i < numRondas; i ++)
for (int j = 0; j < numPartidosPorRonda; j ++)
rondas[i][j].visitante = k;
k --;
if (k == -1) k = equipoMasAlto;
return rondas;
static public Partido[][] calcularLiga(int numEquipos)
if (numEquipos % 2 == 0) return calcularLigaNumEquiposPar(numEquipos); else return calcularLigaNumEquiposImpar(numEquipos);
static public void mostrarPartidos(Partido[][] rondas)
System.out.println("IDA");
for (int i = 0; i < rondas.length; i ++)
System.out.print("Ronda " + (i + 1) + ": ");
for (int j = 0; j < rondas[i].length; j ++)
System.out.print(" " + (1 + rondas[i][j].local) + "-" + (1 + rondas[i][j].visitante));
System.out.println();
System.out.println("VUELTA");
for (int i = 0; i < rondas.length; i ++)
System.out.print("Ronda " + (i + 1) + ": ");
for (int j = 0; j < rondas[i].length; j ++)
System.out.print(" " + (1 + rondas[i][j].visitante) + "-" + (1 + rondas[i][j].local));
System.out.println();
static public void main(String[] args)
System.out.println("Liga con 10 equipos:");
mostrarPartidos(calcularLiga(10));
System.out.println();
System.out.println("Liga con 7 equipos:");
mostrarPartidos(calcularLiga(7));
Liga con 10 equipos: IDA Ronda 1: 1-8 2-7 3-6 4-5 Ronda 2: 8-5 6-4 7-3 1-2 Ronda 3: 2-8 3-1 4-7 5-6 Ronda 4: 8-6 7-5 1-4 2-3 Ronda 5: 3-8 4-2 5-1 6-7 Ronda 6: 8-7 1-6 2-5 3-4 Ronda 7: 4-8 5-3 6-2 7-1 VUELTA Ronda 1: 8-1 7-2 6-3 5-4 Ronda 2: 5-8 4-6 3-7 2-1 Ronda 3: 8-2 1-3 7-4 6-5 Ronda 4: 6-8 5-7 4-1 3-2 Ronda 5: 8-3 2-4 1-5 7-6 Ronda 6: 7-8 6-1 5-2 4-3 Ronda 7: 8-4 3-5 2-6 1-7
Liga con 7 equipos: IDA Ronda 1: 2-7 3-6 4-5 Ronda 2: 6-4 7-3 1-2 Ronda 3: 3-1 4-7 5-6 Ronda 4: 7-5 1-4 2-3 Ronda 5: 4-2 5-1 6-7 Ronda 6: 1-6 2-5 3-4 Ronda 7: 5-3 6-2 7-1 VUELTA Ronda 1: 7-2 6-3 5-4 Ronda 2: 4-6 3-7 2-1 Ronda 3: 1-3 7-4 6-5 Ronda 4: 5-7 4-1 3-2 Ronda 5: 2-4 1-5 7-6 Ronda 6: 6-1 5-2 4-3 Ronda 7: 3-5 2-6 1-7
PHP
<?php $numEquipos = 6; $equipos = [];
// Generar nombres: Equipo-1 ... Equipo-N for ($i = 1; $i <= $numEquipos; $i++) { $equipos[] = "Equipo-$i"; }
// Si es impar, agregamos un DESCANSO if ($numEquipos % 2 !== 0) { $equipos[] = "DESCANSO"; $numEquipos++; }
$rounds = $numEquipos - 1; $partidosPorJornada = $numEquipos / 2;
for ($r = 0; $r < $rounds; $r++) { echo " Jornada " . ($r + 1) . "\n";
for ($i = 0; $i < $partidosPorJornada; $i++) { $local = $equipos[$i]; $visitante = $equipos[$numEquipos - 1 - $i];
// Alternamos local/visitante en rondas pares if ($r % 2 == 1) { [$local, $visitante] = [$visitante, $local];
if ($local !== "DESCANSO" && $visitante !== "DESCANSO") { echo " - $local vs $visitante\n";
// Rotación estilo círculo $fixed = array_shift($equipos); $last = array_pop($equipos); array_unshift($equipos, $fixed); array_splice($equipos, 1, 0, $last);
echo "\n"; }
Ruby
class LeagueRounds attr_reader :teams, :home_rounds, :away_rounds
def initialize(teams) @teams = teams @home_rounds = [] @away_rounds = [] end
def rounds number_of_rounds.times do matches_home = [] matches_away = []
number_of_matches.times do |index| team_1 = teams[index] team_2 = teams[number_of_rounds - index]
matches_home << [team_1, team_2] matches_away << [team_2, team_1] end
home_rounds << matches_home away_rounds << matches_away
rotate_teams! end
return home_rounds + away_rounds end
private
def rotate_teams! last = teams.pop teams.insert(1, last) end
def number_of_rounds @rounds ||= (teams.length - 2) + 1 end
def number_of_matches @matches ||= (teams.length / 2)