しりとり 無限ループ?
【予約語から最長のしりとりを作ろう!】
https://codeiq.jp/ace/stakemura/q408
この問題やってるんですが
処理がtimeoutしちゃいます
最長の結果が10個程度の時は期待通りに動作します
期待される結果が20程度になると(?)timeoutします
単にウチのマシンじゃムリなのか、工夫が足りないのか
無限ループを起こしてるのか、重いだけなのか判断つきません
よろしくお願いします
(cpp11_keywords.csvはC++の予約語84個のcsvです)
<?php
$data=explode(chr(10),file_get_contents('cpp11_keywords.csv'));
foreach($data as $i=>$cpp){$data[$i]=trim($data[$i]);}
echo(implode('<br/>',createSiritori($data)));
function createSiritori($words){
$rtn=array();
$data=array();
for($i=0,$len=count($words);$i<$len;$i++){
$data[$i]=array();
for($j=0;$j<$len;$j++){
if($i==$j)continue;
if(is_connectable($words[$i],$words[$j]))$data[$i][]=$j;
}
}
$rcd=0;
for($i=0;$i<$len;$i++){
$crr=array($i);
for($j_arr=array(0),$j_ind=0,$len_arr=array(count($data[$i]));$j_arr[0]<$len_arr[0];$j_arr[$j_ind]++){
if($j_arr[$j_ind]>=$len_arr[$j_ind]){
array_pop($crr);
array_pop($j_arr);
array_pop($len_arr);
$j_ind--;
}else if(!in_array($data[end($crr)][$j_arr[$j_ind]],$crr)){
$crr[]=$data[end($crr)][$j_arr[$j_ind]];
$j_ind++;
$j_arr[$j_ind]=0;
$len_arr[$j_ind]=count($data[end($crr)]);
if($j_ind>$rcd){$rcd=$j_ind;$rtn=$crr;}
}
}
}
for($i=0,$len=count($rtn);$i<$len;$i++){
$rtn[$i]=$words[$rtn[$i]];
}
return $rtn;
}
function is_connectable($a,$b){
return (substr($a,-1)==substr($b,0,1));
}
お礼
ありがとうございます。参考になりました。