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

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

相关文章

MySQL的JDBC编程详解

《MySQL的JDBC编程详解》:本文主要介绍MySQL的JDBC编程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、前置知识1. 引入依赖2. 认识 url二、JDBC 操作流程1. JDBC 的写操作2. JDBC 的读操作总结前言本文介绍了mysq

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

Python异步编程之await与asyncio基本用法详解

《Python异步编程之await与asyncio基本用法详解》在Python中,await和asyncio是异步编程的核心工具,用于高效处理I/O密集型任务(如网络请求、文件读写、数据库操作等),接... 目录一、核心概念二、使用场景三、基本用法1. 定义协程2. 运行协程3. 并发执行多个任务四、关键

AOP编程的基本概念与idea编辑器的配合体验过程

《AOP编程的基本概念与idea编辑器的配合体验过程》文章简要介绍了AOP基础概念,包括Before/Around通知、PointCut切入点、Advice通知体、JoinPoint连接点等,说明它们... 目录BeforeAroundAdvise — 通知PointCut — 切入点Acpect — 切面

基于Python编写自动化邮件发送程序(进阶版)

《基于Python编写自动化邮件发送程序(进阶版)》在数字化时代,自动化邮件发送功能已成为企业和个人提升工作效率的重要工具,本文将使用Python编写一个简单的自动化邮件发送程序,希望对大家有所帮助... 目录理解SMTP协议基础配置开发环境构建邮件发送函数核心逻辑实现完整发送流程添加附件支持功能实现htm

C#控制台程序同步调用WebApi实现方式

《C#控制台程序同步调用WebApi实现方式》控制台程序作为Job时,需同步调用WebApi以确保获取返回结果后执行后续操作,否则会引发TaskCanceledException异常,同步处理可避免异... 目录同步调用WebApi方法Cls001类里面的写法总结控制台程序一般当作Job使用,有时候需要控制

C#异步编程ConfigureAwait的使用小结

《C#异步编程ConfigureAwait的使用小结》本文介绍了异步编程在GUI和服务器端应用的优势,详细的介绍了async和await的关键作用,通过实例解析了在UI线程正确使用await.Conf... 异步编程是并发的一种形式,它有两大好处:对于面向终端用户的GUI程序,提高了响应能力对于服务器端应

C# async await 异步编程实现机制详解

《C#asyncawait异步编程实现机制详解》async/await是C#5.0引入的语法糖,它基于**状态机(StateMachine)**模式实现,将异步方法转换为编译器生成的状态机类,本... 目录一、async/await 异步编程实现机制1.1 核心概念1.2 编译器转换过程1.3 关键组件解析

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序

使用Docker构建Python Flask程序的详细教程

《使用Docker构建PythonFlask程序的详细教程》在当今的软件开发领域,容器化技术正变得越来越流行,而Docker无疑是其中的佼佼者,本文我们就来聊聊如何使用Docker构建一个简单的Py... 目录引言一、准备工作二、创建 Flask 应用程序三、创建 dockerfile四、构建 Docker