Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 23-02-2009
Peterlolazo Peterlolazo is offline
Miembro
 
Registrado: oct 2007
Posts: 10
Poder: 0
Peterlolazo Va por buen camino
Unhappy Algoritmo para un Calendario de Juegos(Baseball, por ejemplo)

hmm, Necesito ayuda para desarrollar el algoritmo para hacer un calendario de Juegos para una cantidad de equipos dada...
La verdad no pido el codigo en delphi, ya que planeo hacerlo en Vb o en Java, asi que eso no es realmente importante. Pero si alguien de casualidad lo tiene tambien me serviria para yo desarrollar el mio propio..
Bueno, en concreto. lo que este programa debe hacer es lo siguiente..

Si Se introduce por teclado(un textbox o algo parecido) un numero(entre 4 y 20) el programa deberia desplegar.

Por ejemplo: si se introduce el no. 4:

1-2 / 3-4
1-3 / 2-4
1-4 / 2-3

"Como se puede apreciar aqui, solo hay una ronda de juegos, lo que quiere decir que cada equipo se enfrenta a todos los demas Una sola vez, sin que ningun equipo quede sin enfrentarse a otro"
Si por Ejemplo se introduce el numero 5 el proceso sera el Siguiente...:

1-2 / 3-4 [5]
1-3 / 2-5 [4]
1-5 / 2-4 [3]
1-4 / 3-5 [2]
2-3 / 4-5 [1]

"Como se puede ver aqui, tambien hay una sola ronda de juegos, donde cada equipo llega a enfrentarse con todos los demas sin repetir equipos. pero con la variante de que todos los dias descanza un equipo diferente."

La diferencia entre 4 y 5 es que uno es par y el otro es impar(respectivamente) cuando el numero es par. no descanza nadie.
Mientras que si el numero es Impar, siempre descanza un equipo por dia.

Bueno, esto es todo lo que tengo para explicar mi problema, por favor, si alguien sabe como resolverlo me lo hace saber, Gracias de Antemano.

[Entendido]

Última edición por Peterlolazo fecha: 24-02-2009 a las 20:59:42. Razón: Eliminados los Mails.
Responder Con Cita
  #2  
Antiguo 24-02-2009
Avatar de Crandel
[Crandel] Crandel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Parana, Argentina
Posts: 1.475
Poder: 22
Crandel Va por buen camino
Es condición que se jueguen dos partidos por día ?
__________________
[Crandel]
Responder Con Cita
  #3  
Antiguo 24-02-2009
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
No creo que sea tanto po día sino por jornada. O sea, hay que hacer la distribución de los partidos de cada semana.

// Saludos
Responder Con Cita
  #4  
Antiguo 24-02-2009
Peterlolazo Peterlolazo is offline
Miembro
 
Registrado: oct 2007
Posts: 10
Poder: 0
Peterlolazo Va por buen camino
Cita:
Empezado por Crandel Ver Mensaje
Es condición que se jueguen dos partidos por día ?
No, no es cuestion de que se jueguen 2 partidos por dia Crandel, Es condicion de que se juegen tantos partidos por dia como sean posibles, sin que ningun equipo juege 2 veces el mismo dia y sin que ningun equipo vuelta a jugar contra el mismo contrincante 2 veces. por ejemplo, si fueran 6 equipos el primer dia serian 3 juegos.. por ejemplo.

1-2 / 3-4 / 5-6

Como vez no hay un limite de partidos por dia.
Responder Con Cita
  #5  
Antiguo 24-02-2009
Peterlolazo Peterlolazo is offline
Miembro
 
Registrado: oct 2007
Posts: 10
Poder: 0
Peterlolazo Va por buen camino
Cita:
Empezado por roman Ver Mensaje
No creo que sea tanto po día sino por jornada. O sea, hay que hacer la distribución de los partidos de cada semana.

// Saludos
Tampoco se pide saber cuantos partidos por semana, lo unico que hay como requisito en este programa es que cada equipo juege con todos los demas sin repetirse. y, en caso de que el numero de equipos sea impar, que todos los dias descance un equipo diferente.
Responder Con Cita
  #6  
Antiguo 25-02-2009
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.410
Poder: 22
fjcg02 Va camino a la fama
Hacer una matriz de tantas filas y columnas como equipos más una fila

A partir de ahí, tendrás que iterar siempre de izquierda a derecha y de arriba abajo o en columnas, pero siempre en el mismo orden. De no hacerlo así, te saldrán partidos repetidos.
Además, tienes que llevar el control de las columnas y filas que se eliminan en cada iteración.

Ejemplo

Son seis los equipos. Creamos una matriz de filas = nº de equipos más dos y columnas nº de equipos más dos LA diagonal central se anula, ya que no pueden jugar contra sí mismos.
Código:
Anulacion							
	x	1	2	3	4	5	6
	1	x					
	2		x				
	3			x			
	4				x		
	5					x	
	6						x
Las iteraciones terminan cuando has terminado con todos los partidos del equipo 1. Esto indicará la primera vuelta.
primera jornada:
Iteración 1
Primera columna: El equipo 1 se enfrentará consigo mismo. Como la casilla está ocupada, se sigue con la siguiente columna.
Siguiente columna: Como está vacía, se pone un “1”, primera jornada, partido 1 vs 2. En la primera fila y la primera columna, se marcan las filas y columnas 1 y 2 ya que están ya asignados esos equipos.
Se cuenta 1 en el contador de partidos, que máximo será 3 porque son seis equipos.
Iteración 2: Se salta la fila 2 ya que este equipo está ya ocupado en esta jornada.
Iteración 3: se saltan las columnas 1 y 2 porque los equipos están ocupados. La siguiente columna se salta porque no puede jugar contra sí mismo ¿ quién ganaría ¿
Siguiente columna: como está libre, se pone un “1”, segundo partido de la jornada 1.
Se marcan las filas y columnas de los equipos 3 y 4, ya que ya están asignados para esta jornada.
Se cuenta uno al contador de partidos.
Iteración 4: se saltan las filas 1,2,3 y 4 por estar ya asignados los equipos.
Con el equipo 5 se saltan las columnas de los equipos 1,2 ,3 y cuatro. También la del 5 por ser el mismo equipo. Ponemos en la casilla de los equipos 5 y 6 que está libre otro “1” de la primera jornada.
Se suma uno al contador, como ya hemos llegado a tres, empezamos con la segunda jornada.
El resultado es esta tabla
Código:
Anulacion	si	si	si	Si		
	x	1	2	3	4	5	6
Si	1	x	1				
Si	2		x				
Si	3			x	1		
Si	4				X		
	5					x	1
	6						X

Se desmarcan todos los equipos como ocupados.
El resultado es éste
Código:
Anulacion							
	x	1	2	3	4	5	6
	1	X	1				
	2		x				
	3			x	1		
	4				X		
	5					x	1
	6						X
Segunda jornada.
Empezamos con la fila del equipo 1. Saltamos las casillas ocupadas. Como la columna del equipo 3 está libre, ponemos un “2” de segunda jornada.
Ponemos las filas y columnas de los equipos 1 y 3 ocupadas.
Aumentamos el contador de partidos.
Pasamos a la fila 2, que no está ocupada.
Saltamos las columnas de los equipos 1, 2 y 3 por lo ya descrito anteriormente. Plantamos un “2” en la casilla de los equipos 2 y 4.
Marcamos las filas y columnas de los equipos 2 y 4 como ocupadas
Aumentamos el contador de partidos, ya nos queda menos.
Pasamos a la fila 5 que es la siguiente libre. Recorremos las filas ocupadas hasta la columna 6. Como ya está rellena por el valor “1”, pasamos de largo. Como no hay más columnas, pasamos a la siguiente fila.
Pasamos a la fila 6, y en la columna del equipo 5 ponemos el valor “2”.
Como ya tenemos los tres partidos por jornada, pasaremos a la siguiente jornada.
Se desmarcan todas las filas y columnas como ocupadas.
Aplicamos el algoritmo hasta el final (nº de equipos - 1), y el resultado deberá salir algo parecido a esto
Código:
Anulacion							
	x	1	2	3	4	5	6
	1	X	1	2	3	4	5
	2		x	5	2	3	4
	3			x	1		
	4			4	X	5	
	5					X	1
	6			3		2	X
Y ya está. Si quieres puedes utilizar un valor determinado para rellenar las casillas que están ocupadas temporalmente y te ahorras manejar una fila y una columna.

Espero que te sirva de ayuda. Lo único que necesitas es saber cómo se redimensiona una matriz para asignar las filas y las columnas.
Otra cosa que puedes hacer es hacer un stringgrid para ver en pantalla el resultado.
Y por supuesto, gastar lápiz y papel hasta que ajustes perfectamente el algoritmo.

Ya nos contarás.

Un saludo
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #7  
Antiguo 25-02-2009
Avatar de Crandel
[Crandel] Crandel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Parana, Argentina
Posts: 1.475
Poder: 22
Crandel Va por buen camino
Muy buena idea fjcg02, pero estas repitiendo partidos de los equipos 5-6.

Para asegurarte de no repetir se deberia recorrer solo el triangulo superior de la matriz
__________________
[Crandel]
Responder Con Cita
  #8  
Antiguo 26-02-2009
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.410
Poder: 22
fjcg02 Va camino a la fama
Jamás hubiera pensado que nadie leería la solución, y menos chaparsela para encontrar un bug !!
Mis más sinceras felicitaciones, Crandel.
Hay que meter otro par de variantes. Cuando se haga un partido, marcar el reciproco por ejemplo con un 0. Por ejemplo, 1 vs 3, marcar con 0 la casilla 3-1. Si al iterar no se puede completar la jornada - en este caso se repetiría el partido 5-6 en la segunda jornada, habría que desmarcar todos los partidos de la jornada que estamos calculando y volver a empezar calculando el primer partido desde el siguiente equipo. ASí hasta que pueda completarse la jornada.
Espero que sea suficiente. El fósforo lo gasté ayer haciendo el algoritmo.

Saludos
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #9  
Antiguo 27-02-2009
Peterlolazo Peterlolazo is offline
Miembro
 
Registrado: oct 2007
Posts: 10
Poder: 0
Peterlolazo Va por buen camino
Y no hay una manera mas simple de hacerlo?, pk la verdad he leido ese post que dejaste como 5 veces y no logro imaginarme como voy a poner eso en codigos jajajaja.
Responder Con Cita
  #10  
Antiguo 27-02-2009
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.410
Poder: 22
fjcg02 Va camino a la fama
Sí que habría una manera más fácil de hacerlo. Quedamos en cuántos eurakos me vas a dar y te paso el código. Así sólo haces copiar y pegar, que obviamente es más sencillo.
Creo que Crandel también estará de acuerdo ;-)
Ya sabes, son los tiempos, que están muy achuchaos... y los pañales muy caros.

Saluditos
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #11  
Antiguo 27-02-2009
Peterlolazo Peterlolazo is offline
Miembro
 
Registrado: oct 2007
Posts: 10
Poder: 0
Peterlolazo Va por buen camino
jajajaja, pues eso se resume en que voy a leer mas detenidamente el otro post XD jajajaja de cualquier manera Gracias ^^
Responder Con Cita
  #12  
Antiguo 27-02-2009
Avatar de Crandel
[Crandel] Crandel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Parana, Argentina
Posts: 1.475
Poder: 22
Crandel Va por buen camino
Cita:
Empezado por fjcg02 Ver Mensaje
Sí que habría una manera más fácil de hacerlo. Quedamos en cuántos eurakos me vas a dar y te paso el código. Así sólo haces copiar y pegar, que obviamente es más sencillo.
Creo que Crandel también estará de acuerdo ;-)
Ya sabes, son los tiempos, que están muy achuchaos... y los pañales muy caros.

Saluditos
Mi hijo ya dejo los pañales, pero igual los gastos van en aumento
__________________
[Crandel]
Responder Con Cita
  #13  
Antiguo 28-02-2009
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.410
Poder: 22
fjcg02 Va camino a la fama
Bueno, pues estaremos al tanto para ayudarte en lo que podamos, Peterlolazo.
Lo dicho, gasta mucho lápiz y papel, que es como realmente se aprende !!

Saludos
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #14  
Antiguo 28-02-2009
fidel fidel is offline
Miembro
 
Registrado: mar 2005
Posts: 381
Poder: 20
fidel Va por buen camino
Tengo hecho hace tiempo para mí algo parecido, es para torneos internos en las horas de recreo del instituto, lo que pasa es que mis condiciones son algo diferentes de lo que tu necesitas. Yo tengo varias categorías (grupos), y solo juega un equipo de cada categoría por día, siempre que el nº de campos lo permita, si no hay que ir turnandose y descansando algun grupo algún día.

Alguna idea
-----------

- Supongo que tienes un solo grupo de equipos (también se puede hacer con más)
- Primero se hacen los cruces a una vuelta.
- Si se necesitan una segunda vuelta simplemente se copian los mismos partidos invirtiendo el orden de los equipos.
- Luego se distribuye en cada fecha el máximo nº de partidos posibles con arreglo a los horarios y campos disponibles.

Ejemplo con 4 equipos (es válido para cualquier nº de equipos)
Para hacer los cruces de la primera vuelta, es muy simple, 1-2, 1-3, 1-4, 2-3, 2-4, 3-4, pero esto hace que un equipo juegue todos los partidos seguidos y luego este ocioso, o esta ocioso y luego tiene todos seguidos.

Para hacer los cruces de forma que cada equipo juegue de una manera espaciada durante todo el torneo podemos hacerloa así:

- Supongamos que tienes una tabla EQUIPOS con 4 registros, cada registro tiene un solo campo con el nombre de cada equipo: A, B, C, D
- Creas dos tablas auxiliares AUXEQUIPOS, AUXPARTIDOS
- En la tabla AUXEQUIPOS añades todos los registros de la tabla equipos repetidos tantas veces menos una como equipos hay, en este caso repetidos 3 veces (los 4 equipos repetidos 3 veces) y tendrás en AUXEQUIPOS 12 registros que serán:

A
B
C
D
A
B
C
D
A
B
C
D

Ahora hacemos los partidos:

- Coges en una variable el primer equipo de AUXEQUIPOS que es A como equipo local y lo borras de la tabla.
- Coges en una variable el primer equipo de la tabla (ahora será B) como equipo visitente y guardas en una variable el partido A-B , miras en la tabla AUXPARTIDOS (con locate) si este partido ya existe

... si no existe añades un registro y lo pones como partido y borras el equipo visitante (B en este caso), de AUXEQUIPOS.

... si existe avanzas un registro en AUXEQUIPOS y coges el equipo como visitante y haces el partido y vuelves a mirar si este partido ya existe

Con esto ya tenemos el primer partido y habrán desaparecido los dos equipos que intervienen de la tabla AUXEQUIPOS.

- se sigue haciendo lo mismo para los demás partidos, hasta que la tabla AUXEQUIPOS esté vacia, y en AUXPARTIDOS tendremos todos distribuidos racionalmente:

A-B
C-D
A-C
B-D
A-D
B-C

El equipo a juagará el 1º, 3º y 5º partido, el B el 1º, 4º y 6º, etc.

Si necesitas una segunda vuelta, simplemente añade otros seis registros con los mismos partidos pero invertidos los equipos

A-B
C-D
A-C
B-D
A-D
B-C
B-A
D-C
C-A
D-B
D-A
C-B

Ahora tendrás que asignar fechas a estos partidos que hay que jugar, no es dificil, hazlo en un papel y sigue esos pasos pero programando.

Esto es valido para cuando juegan siempre en campos neutrales. Si es a doble vuelta y cada equipo tiene su campo propio, en el que juega cuando es local, habría que mejorar este sistema.

Quizás sea un poco complicado de entender, pero funciona. Cualquier aclaración sigues preguntando.

Última edición por fidel fecha: 28-02-2009 a las 18:56:51.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Algún algoritmo para calcular el último día de un mes David OOP 3 06-03-2008 17:13:01
problemas para ejecutar juegos pda lialias Varios 7 20-02-2008 18:18:51
Algoritmo para comparacion de cadenas danilo_candales Varios 8 17-11-2007 17:23:14
Librería para hacer juegos con Pascal Ñuño Martínez Varios 21 28-09-2007 13:13:57
Algoritmo para calcular el BPM turminator Varios 0 29-05-2007 00:19:49


La franja horaria es GMT +2. Ahora son las 13:17:55.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi