Ver Mensaje Individual
  #1 (permalink)  
Antiguo 02/12/2003, 12:39
Avatar de McManaman
McManaman
 
Fecha de Ingreso: agosto-2003
Ubicación: Ecuador - Guayaquil
Mensajes: 119
Antigüedad: 20 años, 8 meses
Puntos: 0
Problema para pensar 2 Parte....

Buenas Tardes a todos...... el siguiente es un problema que me tiene cabezon de tanto darle y darle vueltas y no poder resolverlo, asi que quizas con ideas de ustedes me podrian ayudar a resolverlo ..... El problema es el siguiente:

Tengo 5 categorias y 20 grupo de personas (5 columnas y 20 filas) ....... o sea 100 personas(5 personas por grupo), lo dificil de esto es que necesito generar un cuadro en el cual me baraja a las 100 personas y me las coloca por grupo de 5 personas, hasta completar los 20 grupos, pero estos deben ser generados de una manera tal que al hacerlo (se genera automaticamente por 20 dias) estos no deben que toparse en ninguno de los siguientes 19 dias.....me explico???? si juan y pedro estuvieron juntos en el dia 2 por ejemplo, en ninguno de los siguientes 18 dias(porque son 20 dias) deben toparse otra vez una vez que han pasado los 20 dias ahi si pueden volverse a topar en cualquiera de los siguientes 20 dias ...... a continuacion pongo un codigo con el cual me ayudo bastante leonardop(y le agradezco muchisimo por su ayuda), pero este no me funciona(debido a la validacion) con 20 personas, solo me funciona con 19 y de ahi funciona con 23, de ahi con 25 de ahi con 29 etc etc etc (hay una secuencia de funcionamiento de 4 - 2), aqui les pongo el codigo que me dio por si acaso alguien me ayuda a hacer que funcione con 20 personas, pero con las validaciones antes mencionadas, porque si al codigo de leonardop le quito las validaciones este si me genera el cuadro pero con gente que se topa muy seguido ..... gracias a todos chaup...........

<?php

/*** Variables personalizables ***/

$n_grupos = 5; // Numero de grupos
$n_personas = 19; // Numero de personas por grupo



/*** Creacion de los datos del programa ***/

$personas = array ();

for ($i = 1; $i <= $n_grupos; $i++) {
$matriz = "p$i"; // Nombre de cada matriz de personas
$personas[$matriz] = array ();

for ($j = 1; $j <= $n_personas; $j++) {
$persona = "persona$i-$j"; // Nombre de cada persona
$personas[$matriz][] = $persona;
}
}



/*** Mostrar el listado de personas ***/

echo <<<FIN
<h3>Existen los siguientes grupos de personas:</h3>
<table>
<tr>
FIN;

for ($i = 1; $i <= $n_grupos; $i++)
echo " <th>p$i</th>\n";

echo " </tr>\n";

for ($i = 0; $i < $n_personas; $i++) {
echo " <tr>\n";

for ($j = 1; $j <= $n_grupos; $j++)
echo ' <td>' . $personas["p$j"][$i] . "</td>\n";

echo " </tr>\n";
}

echo "</table>\n";



/*** Calcular la distribucion de las personas en los carros ***/

$dias = array ();
$personas_cruzadas = array ();
$indices = array (0, 0, 0, 0, 0);

for ($dia = 0; $dia < $n_personas; $dia++) {
$dias[$dia] = array ();

$personas_acomodadas = array ();

for ($carro = 0; $carro < $n_personas; $carro++) {
$dias[$dia][$carro] = array ();


for ($grupo = 0; $grupo < $n_grupos; $grupo++) {
$persona_fue_elegida = false;

$indice = $indices[$grupo] + $carro;
if ($indice >= $n_personas)
$indice %= $n_personas;

$persona = &$personas['p' . ($grupo + 1)][$indice];

// Chequear si la persona actual ya se ha cruzado con
// alguno de los pasajeros ya asignados a este carro

$se_ha_cruzado = false;

if (array_key_exists ($persona, $personas_cruzadas)) {

for ($i = 0; $i < $grupo; $i++) {

if (in_array ($dias[$dia][$carro][$i],
$personas_cruzadas[$persona])) {

$se_ha_cruzado = true;
break;
}
}
}


if (! in_array ($persona, $personas_acomodadas) and
! $se_ha_cruzado) {

$persona_fue_elegida = true;

$dias[$dia][$carro][] = $personas_acomodadas[] = $persona;
}

if (! $persona_fue_elegida) {
echo '<p>No es posible acomodar a las personas en los ' .
"carros según los requerimientos.</p>\n";

exit (1);
}
}

// Llevar el registro de los pasajeros que se han reunido en
// el carro

for ($i = 0; $i < $n_grupos; $i++) {
for ($j = 0; $j < $n_grupos; $j++) {
if ($i != $j)
$personas_cruzadas[$dias[$dia][$carro][$i]][] =
$dias[$dia][$carro][$j];
}
}

}

for ($i = 0, $inc = 1; $i < $n_grupos; $i++, $inc++)
$indices[$i] = (($indices[$i] + $inc >= $n_personas) ?
(($indices[$i] + $inc) % $n_personas) :
($indices[$i] + $inc));
}



/*** Imprimir los resultados ***/

echo "<h3>Resultados de la ubicación de personas en los carros:</h3>\n";

for ($dia = 0; $dia < $n_personas; $dia++) {
$dia_num = $dia + 1;

echo <<<FIN
<table>
<caption>Día $dia_num</caption>
<tr>
<th>Carro</th>
<th colspan="$n_grupos">Pasajeros</th>
</tr>
FIN;

for ($carro = 0; $carro < $n_personas; $carro++) {
echo " <tr>\n <td>" . ($carro + 1) . "</td>\n";

for ($pasajero = 0; $pasajero < $n_grupos; $pasajero++)
echo ' <td>' . $dias[$dia][$carro][$pasajero] . "</td>\n";

echo " </tr>\n";
}


echo "</table>\n<br />\n";
}

?>
__________________
...Hay unos que saben TODO de nada y otros que saben NADA de TODO... think about it