Q1:倔强青铜
尝试用编程解决问题
难度系数:★
优秀的扫地机器人
(IQ:80 目标时间:20分钟)
现在有很多制造商都在卖扫地机器人,它非常有用,能为忙碌的我们分担家务负担。不过我们也很难理解为什么扫地机器人有时候会反复清扫某一个地方。
假设有一款不会反复清扫同一个地方的机器人,它只能前后左右移动。举个例子,如果第1 次向后移动,那么连续移动3 次时,就会有以下9 种情况(如图 )。又因为第1 次移动可以是前后左右4 种情况,所以移动3 次时全部路径有9×4 = 36 种。
※ 最初的位置用0 表示,其后的移动位置用数字表示。
(移动路径事例)
问题:求这个机器人移动12 次时,有多少种移动路径?
(ps:最初三次的移动方向很自由,从第四次开始,坐标有些方向就不能移动啦)
尝试了写了一个代码:
<?php
/**
* 【问题】
*
* 举个例子,如果第1 次向后移动,那么连续移动3 次时,就会有以下9 种情况(如图 )。
* 又因为第1 次移动可以是前后左右4 种情况,所以移动3 次时全部路径有9×4 = 36 种。
*
* eg: 问机器人移动12次,有多少种方式?
*
*/
/**
* 【分析】
*
* 坐标分析法 初始 [0, 0]
* 前后左右方向计算方式:
* $way_list = [1, 2, 3, 4];
* 前[1] y-1 后[2] y+1 左[3] x-1 右[4] x+1
*
* 走动的路径点坐标 如果存在则跳过,否则可以移动
*
*/
$now = ['x' => 0, 'y' => 0];
$result_list = [['0,0']];
$limit = empty($argv[1]) ? 12 : intval($argv[1]); // 需要移动的次数 默认 12
$a =_get_way($result_list, $limit);
var_dump($limit . " count: " . count($a[$limit]));
/**
* 获取每一步移动的路径选择
* @param $result_list
* @param $limit
* @return string
*/
function _get_way($result_list, $limit){
for($i = 1; $i <= $limit; $i++){
$way_list = [1, 2, 3, 4];
foreach ($result_list[$i - 1] as $key => $v) {
foreach ($way_list as $vv) {
$result_list = _check_way($result_list, $v, $vv, $i, $key);
}
}
}
return $result_list;
}
/**
* 检查下一个点 是否可以移动
* @param $result_list
* @param $now
* @param $way
* @param $limit
* @param $key
* @return string
*/
function _check_way($result_list, $now, $way, $limit, $key){
$now_list = _get_last_point($now);
$x = $now_list[0];
$y = $now_list[1];
switch ($way) {
case 1:
$y -= 1;
break;
case 2:
$y += 1;
break;
case 3:
$x -= 1;
break;
case 4:
$x += 1;
break;
default:
break;
}
$re = $x . "," . $y;
if(!_check_point($re, $result_list[$limit - 1][$key])){
$result_list[$limit][] = $now . ';' . $re;
}
return $result_list;
}
function _get_last_point($point_str){
$list = explode(";", $point_str);
$last_point = $list[count($list) -1];
$last_point_list = explode(',', $last_point);
return $last_point_list;
}
function _check_point($str, $long_str){
$list = explode(";", $long_str);
if(in_array($str, $list)) {
return true;
}
return false;
}
执行结果如下:
[vagrant@vagrant catchData]$ php getLevel.php 1
/opt/htdocs/test/catchData/getLevel.php:30:
string(10) "1 count: 4"
[vagrant@vagrant catchData]$ php getLevel.php 2
/opt/htdocs/test/catchData/getLevel.php:30:
string(11) "2 count: 12"
[vagrant@vagrant catchData]$ php getLevel.php 3
/opt/htdocs/test/catchData/getLevel.php:30:
string(11) "3 count: 36"
[vagrant@vagrant catchData]$ php getLevel.php 4
/opt/htdocs/test/catchData/getLevel.php:30:
string(12) "4 count: 100"
[vagrant@vagrant catchData]$ php getLevel.php 5
/opt/htdocs/test/catchData/getLevel.php:30:
string(12) "5 count: 284"
[vagrant@vagrant catchData]$ php getLevel.php 6
/opt/htdocs/test/catchData/getLevel.php:30:
string(12) "6 count: 780"
[vagrant@vagrant catchData]$ php getLevel.php 7
/opt/htdocs/test/catchData/getLevel.php:30:
string(13) "7 count: 2172"
[vagrant@vagrant catchData]$ php getLevel.php 8
/opt/htdocs/test/catchData/getLevel.php:30:
string(13) "8 count: 5916"
[vagrant@vagrant catchData]$ php getLevel.php 9
/opt/htdocs/test/catchData/getLevel.php:30:
string(14) "9 count: 16268"
[vagrant@vagrant catchData]$ php getLevel.php 10
/opt/htdocs/test/catchData/getLevel.php:30:
string(15) "10 count: 44100"
[vagrant@vagrant catchData]$ php getLevel.php 11
/opt/htdocs/test/catchData/getLevel.php:30:
string(16) "11 count: 120292"
[vagrant@vagrant catchData]$ php getLevel.php 12
string(16) "12 count: 324932"