【程序段位】★【倔强青铜】★ 程序编程题

Q1:倔强青铜

尝试用编程解决问题

 

难度系数:★

优秀的扫地机器人

(IQ:80    目标时间:20分钟)

现在有很多制造商都在卖扫地机器人,它非常有用,能为忙碌的我们分担家务负担。不过我们也很难理解为什么扫地机器人有时候会反复清扫某一个地方。

假设有一款不会反复清扫同一个地方的机器人,它只能前后左右移动。举个例子,如果第1 次向后移动,那么连续移动3 次时,就会有以下9 种情况(如图 )。又因为第1 次移动可以是前后左右4 种情况,所以移动3 次时全部路径有9×4 = 36 种。

※ 最初的位置用0 表示,其后的移动位置用数字表示。

20184113_wZCZ.jpg

(移动路径事例)

问题:求这个机器人移动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"

 

 

 

转载于:https://my.oschina.net/tigerlovecat/blog/1576191

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值