> 백엔드 개발 > PHP 튜토리얼 > 高分求一个算法,在线等待中...

高分求一个算法,在线等待中...

WBOY
풀어 주다: 2016-06-23 14:24:23
원래의
741명이 탐색했습니다.

本帖最后由 sibang 于 2013-10-16 22:08:17 编辑

<?PHP$arr=Array(	Array('a','b','c'),	Array('d','e','f'),	Array('g','h','i'),	//第二?array的??是未知的,?了方便?例所以只?了3?);$x3=iArray($arr,3);Echo '<pre class="brush:php;toolbar:false">',Var_Dump($x3),'
로그인 후 복사
';/**期望的?果是:array { 'adg','adh','adi', 'aeg','aeh','aei', 'afg','afh','afi', 'bdg','bdh','bdi', 'beg','beh','bei', 'bfg','bfh','bfi', 'cdg','cdh','cdi', 'ceg','ceh','cei', 'cfg','cfh','cfi',}/**/$x2=iArray($arr,2);Echo '
',Var_Dump($x2),'
로그인 후 복사
';/**期望的?果是:array { 'ad','ae','af', 'ag','ah','ai', 'bd','be','bf', 'bg','bh','bi', 'cd','ce','cf', 'cg','ch','ci', 'dg','dh','di', 'eg','eh','ei', 'fg','fh','fi',}/**/


回复讨论(解决方案)

好多小花花

$arr=Array(    Array('a','b','c'),    Array('d','e','f'),    Array('g','h','i'),    //第二?array的??是未知的,?了方便?例所以只?了3?); print_r(iArray($arr,3));print_r(iArray($arr,2)); function iArray($ar, $n) {  if($n == 2) { //3取2的组合    $ar = array(      array($ar[0], $ar[1]),      array($ar[0], $ar[2]),      array($ar[1], $ar[2]),    );  }else $ar = array($ar);  $res = array();  foreach($ar as $d) {    $r = array_pop($d);    while($d) {      $t = array();      foreach(array_pop($d) as $x)        foreach($r as $y) $t[] = $x . $y;      $r = $t;    }    $res = array_merge($res, $r);  }  return $res;}
로그인 후 복사
로그인 후 복사
Array
(
[0] => adg
[1] => adh
[2] => adi
[3] => aeg
[4] => aeh
[5] => aei
[6] => afg
[7] => afh
[8] => afi
[9] => bdg
[10] => bdh
[11] => bdi
[12] => beg
[13] => beh
[14] => bei
[15] => bfg
[16] => bfh
[17] => bfi
[18] => cdg
[19] => cdh
[20] => cdi
[21] => ceg
[22] => ceh
[23] => cei
[24] => cfg
[25] => cfh
[26] => cfi
)
Array
(
[0] => ad
[1] => ae
[2] => af
[3] => bd
[4] => be
[5] => bf
[6] => cd
[7] => ce
[8] => cf
[9] => ag
[10] => ah
[11] => ai
[12] => bg
[13] => bh
[14] => bi
[15] => cg
[16] => ch
[17] => ci
[18] => dg
[19] => dh
[20] => di
[21] => eg
[22] => eh
[23] => ei
[24] => fg
[25] => fh
[26] => fi
)

$arr=Array(    Array('a','b','c'),    Array('d','e','f'),    Array('g','h','i'),    //第二?array的??是未知的,?了方便?例所以只?了3?); print_r(iArray($arr,3));print_r(iArray($arr,2)); function iArray($ar, $n) {  if($n == 2) { //3取2的组合    $ar = array(      array($ar[0], $ar[1]),      array($ar[0], $ar[2]),      array($ar[1], $ar[2]),    );  }else $ar = array($ar);  $res = array();  foreach($ar as $d) {    $r = array_pop($d);    while($d) {      $t = array();      foreach(array_pop($d) as $x)        foreach($r as $y) $t[] = $x . $y;      $r = $t;    }    $res = array_merge($res, $r);  }  return $res;}
로그인 후 복사
로그인 후 복사
Array
(
[0] => adg
[1] => adh
[2] => adi
[3] => aeg
[4] => aeh
[5] => aei
[6] => afg
[7] => afh
[8] => afi
[9] => bdg
[10] => bdh
[11] => bdi
[12] => beg
[13] => beh
[14] => bei
[15] => bfg
[16] => bfh
[17] => bfi
[18] => cdg
[19] => cdh
[20] => cdi
[21] => ceg
[22] => ceh
[23] => cei
[24] => cfg
[25] => cfh
[26] => cfi
)
Array
(
[0] => ad
[1] => ae
[2] => af
[3] => bd
[4] => be
[5] => bf
[6] => cd
[7] => ce
[8] => cf
[9] => ag
[10] => ah
[11] => ai
[12] => bg
[13] => bh
[14] => bi
[15] => cg
[16] => ch
[17] => ci
[18] => dg
[19] => dh
[20] => di
[21] => eg
[22] => eh
[23] => ei
[24] => fg
[25] => fh
[26] => fi
)
??可能是:
$arr=Array(
Array('a','b','c','j'),
Array('d','e','f'),
Array('g','h','i'),
Array('k','l','m'),
);

也可能是:
$arr=Array(
Array('a','b','c','j'),
Array('d','e','f'),
Array('g','h','i'),
Array('k','l','m'),
Array('2','1','3','sd','ee'),
);

iArray($ar,$n)
$n的取值??是: 2~6

我在代码中已经提示了要先求一下 M取N 的组合
而求组合的函数相信你的代码库中已经是有的
这是我用的

// combination 组合function combination( $arr, $num=0) {  $len = count($arr);  if($num == 0) $num = $len;  $res = array();  for($i=1,$n=pow(2, $len);$i<$n;++$i) {    $tmp = str_pad(base_convert($i, 10, 2), $len, '0', STR_PAD_LEFT);    $t = array();    for($j=0;$j<$len;++$j) {      if($tmp{$j} == '1') {        $t[] = $arr[$j];      }    }    if(count($t) == $num) $res[] = $t;  }  return $res;}
로그인 후 복사

所以 iArray 函数就可写作
function iArray($ar, $n) {  $res = array();  foreach(combination($ar, $n) as $d) {    $r = array_pop($d);    while($d) {      $t = array();      foreach(array_pop($d) as $x)        foreach($r as $y) $t[] = $x . $y;      $r = $t;    }    $res = array_merge($res, $r);  }  return $res;}
로그인 후 복사
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿