bueno el resultado final despues de 6 horas de trabajo 2 cafes una hamburguesa y una llamada de mi ex
dieron el resultado final
clase.tuadmin.backtracking.php
<?php
//clase.tuadmin.backtracking.php
class tuadmin_backtracking_1
{
private $symbols = array(
array('0','1'),
array('a','b'),
array('p','q'),
);
private $result = array();
private $total=8;
private $repeticion_col=array(4,2,1);
public function __construct()
{
call_user_func_array(array($this,"setSymbol"),func_get_args());
$this->_llenar();
}
public function addSymbols()
{
call_user_func_array(array($this,"setSymbol"),func_get_args());
$this->_llenar();
}
private function setSymbol()
{
$symbols = func_get_args();
if(!empty($symbols))
{
$this->symbols = func_get_args();
$this->repeticion_col=array();
}
}
private function _total()
{
$this->total = 1;
foreach($this->symbols as $col)
{
$this->total = $this->total * count($col);
}
}
private function _repeticion_col()
{
$total = 1;
$index = count( $this->symbols) - 1;
$this->repeticion_col[$index] = 1;
for($i = $index-1;$i > -1;$i-- )
{
$total = count($this->symbols[$index]) * $total;
$this->repeticion_col[$i] = $total;
$index--;
}
}
private function _llenar()
{
$this->_repeticion_col();
$this->_total();
ksort($this->repeticion_col);
foreach($this->repeticion_col as $column=>$rep)
{
$this->_llenar_col($column,$rep);
}
}
private function _llenar_col($columna=0,$repeticion_por_array)
{
$incremento=0;
for($i=0;$i < $this->total ;$i++)
{
$index = ceil(($incremento+1)/$repeticion_por_array)-1;
if(!isset($this->symbols[$columna][$index]))
{
$incremento=0;
$index = ceil(($incremento+1)/$repeticion_por_array)-1;
}
$this->result[$i][$columna] = $this->symbols[$columna][$index];
$incremento++;
}
}
public function dump()
{
var_dump($this->result);
}
public function getRows()
{
return $this->result;
}
}
?>
Resolucion del problema
<?php
error_reporting(E_ALL);
require ('clase.tuadmin.backtracking.php');
//creamos un pequeño proceso para las columnas de 0 y 1
do
{
$numero =(int) stream_get_line(STDIN,128);
}
while(ceil($numero) < 3);
$simbolos = array();
for($i = 0;$i < $numero;$i++)
{
$simbolos[] = str_split('01');
}
$llenar = new tuadmin_backtracking_1();
call_user_func_array(array($llenar,'addSymbols'),$simbolos);
foreach($llenar->getRows() as $row)
{
foreach($row as $symbol)
{
echo $symbol;
}
echo "\n";
}
bueno tengan buen tarde