//前提,a,b,c,d,e,f,g,p=1 互不相同
function abc($array,$start,$end){
list($a,$b,$c,$d,$e,$f,$g,$h,$p)=$array;
if(10*$a+$b-10*$c-$d==10*$e+$f){
if(10*$e+$f+10*$g+$h==111){
echo json_encode($array); //输出,直接输出个数组,【a,b,c,d,e,f,g,h,p,多余项】
return ;
}
}
for($i=$start+1;$i
$array1=$array;
$array1[$start]=$array[$i];
$array1[$i]=$array[$start];
abc($array1,$start+1,$end);//递归
}
}
abc([0,2,3,4,5,6,7,8,9],0,9);
这样写我试了下,挺快的,一秒以内吧
不好意思,输出错了啊,没有输出p,想输出p的话,当然输出形式你可以随便定义
把 if(10$e+$f+10$g+$h==111){
改为 if(10$e+$f+10$g+$h==111*p){
以及 abc([0,2,3,4,5,6,7,8,9],0,9);
改为 abc([0,1,2,3,4,5,6,7,8,9],0,10);
希望是你要的答案
不好意思,突然想到此代码存在错误,然后就过来改一下
(我也不知道为什么我在写项目时,还会想起这个 T_T )
重新给出代码,以及思路
先说思路,根据题意,这题里面9个数字应该互不相同,排列组合共有10!的可能。
我们将这10个数字依次列出来,其中有一个是不需要的。
问题转换为怎么实现这10!的可能,我的答案就是交换,一次交换其中的两个数字。
于是自然而然想到递归,先判断当前情形是否满足条件,满足则输出。
当然其实这里还有个错误,此时不应该立即return,修改方法很多,比如把判断移到for后面;
【比如我初始条件就是一个正确答案,则输出一个就结束了,随便尝试改一下。】
然后将目标位$start与之后的每一位分别进行交换,目标位后移,递归,直到结束。
此时罗列出了所有的可能,只要满足判断就可以输出了,去掉时间函数,15行内搞定。
用时3秒,吧$p=1写死,如我上面做的,则可以在0.5秒内结束。
【这回大概不会有错了,继续写项目了 。。。 】
function abc($array,$start,$end){
list($a,$b,$c,$d,$e,$f,$g,$h,$p)=$array;
if(10*$a+$b-10*$c-$d==10*$e+$f){
if(10*$e+$f+10*$g+$h==111*$p){
echo json_encode($array)."\r\n";
return ;
}
}
for($i=$start;$i
$array1=$array;
$array1[$start]=$array[$i];
$array1[$i]=$array[$start];
abc($array1,$start+1,$end);
}
}
function getMillisecond() {
list($t1, $t2) = explode(' ', microtime());
return (float)sprintf('%.0f',(floatval($t1)+floatval($t2))*1000);
}
$a=getMillisecond();
abc([0,1,2,3,4,5,6,7,8,9],0,10);
$b=getMillisecond();
echo ($b-$a)."ms";
//输出数组的最后一个数字是多余项,懒得改了
C:\Users\shentianmei\Desktop>php a.php
[3,4,0,9,2,5,8,6,1,7]
[3,6,0,9,2,7,8,4,1,5]
[4,5,0,6,3,9,7,2,1,8]
[5,2,0,9,4,3,6,8,1,7]
[5,7,0,8,4,9,6,2,1,3]
[5,7,0,9,4,8,6,3,1,2]
[7,2,0,9,6,3,4,8,1,5]
[8,4,0,5,7,9,3,2,1,6]
[8,4,0,9,7,5,3,6,1,2]
[8,5,4,6,3,9,7,2,1,0]
[8,5,0,6,7,9,3,2,1,4]
[8,6,5,4,3,2,7,9,1,0]
[9,3,0,6,8,7,2,4,1,5]
[9,3,0,7,8,6,2,5,1,4]
[9,5,2,7,6,8,4,3,1,0]
[9,0,2,7,6,3,4,8,1,5]
[9,0,6,3,2,7,8,4,1,5]
3021ms