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

2023-11-22 14:10

本文主要是介绍【程序段位】★【倔强青铜】★ 程序编程题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

这篇关于【程序段位】★【倔强青铜】★ 程序编程题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/410692

相关文章

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

SpringBoot实现微信小程序支付功能

《SpringBoot实现微信小程序支付功能》小程序支付功能已成为众多应用的核心需求之一,本文主要介绍了SpringBoot实现微信小程序支付功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作... 目录一、引言二、准备工作(一)微信支付商户平台配置(二)Spring Boot项目搭建(三)配置文件

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

Python异步编程中asyncio.gather的并发控制详解

《Python异步编程中asyncio.gather的并发控制详解》在Python异步编程生态中,asyncio.gather是并发任务调度的核心工具,本文将通过实际场景和代码示例,展示如何结合信号量... 目录一、asyncio.gather的原始行为解析二、信号量控制法:给并发装上"节流阀"三、进阶控制

如何用java对接微信小程序下单后的发货接口

《如何用java对接微信小程序下单后的发货接口》:本文主要介绍在微信小程序后台实现发货通知的步骤,包括获取Access_token、使用RestTemplate调用发货接口、处理AccessTok... 目录配置参数 调用代码获取Access_token调用发货的接口类注意点总结配置参数 首先需要获取Ac

基于Python开发PDF转Doc格式小程序

《基于Python开发PDF转Doc格式小程序》这篇文章主要为大家详细介绍了如何基于Python开发PDF转Doc格式小程序,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用python实现PDF转Doc格式小程序以下是一个使用Python实现PDF转DOC格式的GUI程序,采用T

将java程序打包成可执行文件的实现方式

《将java程序打包成可执行文件的实现方式》本文介绍了将Java程序打包成可执行文件的三种方法:手动打包(将编译后的代码及JRE运行环境一起打包),使用第三方打包工具(如Launch4j)和JDK自带... 目录1.问题提出2.如何将Java程序打包成可执行文件2.1将编译后的代码及jre运行环境一起打包2

在不同系统间迁移Python程序的方法与教程

《在不同系统间迁移Python程序的方法与教程》本文介绍了几种将Windows上编写的Python程序迁移到Linux服务器上的方法,包括使用虚拟环境和依赖冻结、容器化技术(如Docker)、使用An... 目录使用虚拟环境和依赖冻结1. 创建虚拟环境2. 冻结依赖使用容器化技术(如 docker)1. 创

C#多线程编程中导致死锁的常见陷阱和避免方法

《C#多线程编程中导致死锁的常见陷阱和避免方法》在C#多线程编程中,死锁(Deadlock)是一种常见的、令人头疼的错误,死锁通常发生在多个线程试图获取多个资源的锁时,导致相互等待对方释放资源,最终形... 目录引言1. 什么是死锁?死锁的典型条件:2. 导致死锁的常见原因2.1 锁的顺序问题错误示例:不同