只今、独学でプログラミング勉強中です。
「プログラマ脳を鍛える数学パズル」という本に挑んでいますが8問目で悩んでいます。
本にはPHPでの回答は載っていないのでご教授いただきたいです。
問題は、
同じ場所を通らない掃除ロボットを考えます。このロボットは前後左右にのみ移動することができます。例えば、3回移動する場合、最初に後ろに移動する経路は以下の9パターンあります(画像参照)。最初の移動方向は前後左右があるので、考えられる移動経路は全部で9×4=36通りあります。
※最初の位置を「0」で、その後の移動位置を数字で表現しています。
このロボットが12回移動するとき、考えられる移動経路のパターンが何通りあるかを求めてください。
(引用:プログラマ脳を鍛える数学パズル)
答えは324932通りです。
これをPHPで以下のように考えてみましたが、PHP Fatal error: Allowed memory size ofエラーが出ます。
試しに第一引数を「3」にしても同じエラーが出るのでメモリを増やせばよい問題ではなく、私の記述がよくないのだと考えていますが、どこが悪いのか分かりません。
どなたか解答をいただければ幸いです。
php
1function move($steps, $log) { 2 if (count($log) == $steps + 1) { 3 return 1; 4 } 5 6 $cnt = 1; 7 $pattern = [[0, 1], [0, -1], [1, 0], [-1, 0]]; // 進める位置 8 9 foreach ($pattern as $pos) { 10 $next = [end($log)[0] + $pos[0], end($log)[1] + $pos[1]]; 11 12 // 探索済みでなければ移動 13 if (!in_array($next, $log)) { 14 array_push($log, $next); 15 $cnt += move($steps, $log); 16 } 17 } 18 return $cnt; 19} 20 21echo move(12, [[0,0]]);
回答1件
あなたの回答
tips
プレビュー