Задачка с генерированием вариантов

L-ZiX

Guest
Задачка с генерированием вариантов

Существует массив со скажем 5 значениями: а б в г д
Задача: получить на выходе после выполнения скрипта:
а | б | в | г | д |
а б | а в | а г | а д | б в | б г | б д | в г | в д | г д | - варианты «б а» или «д б» не требуются, т.к. есть «а б» и «б д» соответственно и т.д.
а б в | а б г | а б д | а в г | а в д | а г д | б в г | б в д | б г д | в г д |
а б в г | а б в д | а б г д | а в г д | б в г д |
а б в г д |

Не знаю как описать словами задачу, привёл пример.
Если что-то не понятно, задавайте вопросы.
Если "помоч решить" or "решить" её бесплатно ни кому не представляется возможным, назовите свою цену :)
 

zap

Guest
$result="";
$arr=array(1=>'a',2=>'b',3=>'c');
for($i=1;$i<=count($arr);$i++){
for($j=1;$j<=count($arr);$j++){
$result.=$arr[$i].$arr[$j]."|";
}
}
print $result;

-~{}~ 14.07.05 22:11:

почти то, но нужно пошаманить :)
 

L-ZiX

Guest
zap такой вариант не подойдёт, т.к. там есть зависимость количества циклов for от количества значений массивов.

-~{}~ 15.07.05 08:18:

SiMM Тоже не решение. Там вывод идёт только вариантов с двойной комбинацией.
И у меня в задаче требуется если 5 значений в массиве, то вывести варианты и по 2 значения, и по 3, и по 4

-~{}~ 15.07.05 08:20:

sakon PHP4
 

tashkentchi

Новичок
Пишешь рекурсивную функцию, которая:
1. Добавляет в результат первый элемент масива (a[0])
2. К остатку применяет саму себя и возвращает соответствующий массив (result)
3. Добавляет в результат массив result
4. К элементам массива result дописыват a[0] (получая массив result2)
5. Добавляет в результат массив result2
 

rotoZOOM

ACM maniac
PHP:
// $arr - исходный массив
$res=array();
$n=count($arr);
for ($i=1;$i<(1<<$n);$i++){
    $s="";
    for ($j=0;$j<$n;$j++){
        if ($i&(1<<$j))$s.=$arr[$j];
    }
    $res[]=$s;
}
// $res - массив всех сгенерированных строк
Сложность алгоритма O(n*2^n), количество полученных вариантов == 2^n, где n - это количество элементов первоначального массива, так что не надо делать n слишком большим :)
 

tashkentchi

Новичок
Не тестировал:
PHP:
function alternatives($arr) {
   $result[] = $arr[0];
   if ( count($arr) > 1 ) {
      $subResult = alternatives( array_slice($arr, 1) );
      foreach ( $subResult as $val ) {
         $result[] = $val;
         $result[] = $arr[0].'|'.$val;
      }
   }
   return $result;
}
 

ttrehl

Guest
PHP:
<?
$str=array('а','б','в','г','д');
foreach($str as $volume)
	{
		foreach($str as $volume1)
			{
				$pos="$volume$volume1";
				$arr["$volume$volume1"]="$volume$volume1";
				if(substr_count($pos, $volume)>1||$arr[strrev($pos)]) unset($arr["$volume$volume1"]);
			}
		foreach($arr as $key=>$volume2)
			{
				$arr["$key$volume"]="$key$volume";
				if(substr_count("$key$volume", $volume)>1) unset($arr["$key$volume"]);
			}
	}
foreach ($arr as $key=>$volume)
	{
		foreach ($arr as $key1=>$volume1)
			{ 
				if($key!=$key1&&count_chars($key, 3)==count_chars($key1, 3)) unset($arr["$key"]);
			}
					
		if(strlen($key)>$maxlen) $maxlen=strlen($key);
	}
for($i=1;$i<=$maxlen;$i++)
	{
		foreach($arr as $key=>$volume)
				{
					if(strlen($key)==$i) $result[].=$volume;
				}
	}
foreach($result as $key=>$volume)
	{
		echo $volume."|";
	}
?>
 
Сверху