PHP实现的蚂蚁爬杆路径算法代码


Posted in PHP onDecember 03, 2015

本文实例讲述了PHP实现的蚂蚁爬杆路径算法代码。分享给大家供大家参考,具体如下:

<?php
/**
 * 有一根27厘米的细木杆,在第3厘米、7厘米、11厘米、17厘米、23厘米这五个位置上各有一只蚂蚁。
 * 木杆很细,不能同时通过一只蚂蚁。开始 时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头,
 * 但不会后退。当任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走。假设蚂蚁们每秒钟可以走一厘米的距离。
 * 编写程序,求所有蚂蚁都离开木杆 的最小时间和最大时间。
 */
function add2($directionArr, $count, $i) {
 if(0 > $i) { // 超出计算范围
  return $directionArr;
 }
 if(0 == $directionArr[$i]) { // 当前位加1
  $directionArr[$i] = 1;
  return $directionArr;
 }
 $directionArr[$i] = 0;
 return add2($directionArr, $count, $i - 1); // 进位
}
$positionArr = array( // 所在位置
 3,
 7,
 11,
 17,
 23
);
function path($positionArr) { // 生成测试路径
 $pathCalculate = array();
 $count = count($positionArr);
 $directionArr = array_fill(0, $count, 0); // 朝向
 $end = str_repeat('1', $count);
 while (true) {
  $path = implode('', $directionArr);
  $pathArray = array_combine($positionArr, $directionArr);
  $total = calculate($positionArr, $directionArr);
  $pathCalculate['P'.$path] = $total;
  if($end == $path) { // 遍历完成
   break;
  }
  $directionArr = add2($directionArr, $count, $count - 1);
 }
 return $pathCalculate;
}
function calculate($positionArr, $directionArr) {
 $total = 0; // 总用时
 $length = 27; // 木杆长度
 while ($positionArr) {
  $total++; // 步增耗时
  $nextArr = array(); // 下一步位置
  foreach ($positionArr as $key => $value) {
   if(0 == $directionArr[$key]) {
    $next = $value - 1; // 向0方向走一步
   } else {
    $next = $value + 1; // 向1方向走一步
   }
   if(0 == $next) { // 在0方向走出
    continue;
   }
   if($length == $next) { // 在1方向走出
    continue;
   }
   $nextArr[$key] = $next;
  }
  $positionArr = $nextArr; // 将$positionArr置为临时被查找数组
  foreach ($nextArr as $key => $value) {
   $findArr = array_keys($positionArr, $value);
   if(count($findArr) < 2) { // 没有重合的位置
    continue ;
   } 
   foreach ($findArr as $findIndex) {
    $directionArr[$findIndex] = $directionArr[$findIndex] ? 0 : 1; // 反向处理
    unset($positionArr[$findIndex]); // 防止重复查找计算
   }
  }
  $positionArr = $nextArr; // 将$positionArr置为下一步结果数组
 }
 return $total;
}
$pathCalculate = path($positionArr);
echo '<pre>calculate-';
print_r($pathCalculate);
echo 'sort-';
asort($pathCalculate);
print_r($pathCalculate);

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
php下将图片以二进制存入mysql数据库中并显示的实现代码
May 27 PHP
rrmdir php中递归删除目录及目录下的文件
May 15 PHP
PHP序列号生成函数和字符串替换函数代码
Jun 07 PHP
php中apc缓存使用示例
Dec 25 PHP
ThinkPHP CURD方法之order方法详解
Jun 18 PHP
PHP中使用asort进行中文排序失效的问题处理
Aug 18 PHP
PHP闭包实例解析
Sep 08 PHP
Laravel中的chunk组块结果集处理与注意问题
Aug 15 PHP
php PDO属性设置与操作方法分析
Dec 27 PHP
Thinkphp5框架简单实现钩子(Hook)行为的方法示例
Sep 03 PHP
PHP实现的AES 128位加密算法示例
Sep 16 PHP
php7下的filesize函数
Sep 30 PHP
PHP实现QQ空间自动回复说说的方法
Dec 02 #PHP
如何在旧的PHP系统中使用PHP 5.3之后的库
Dec 02 #PHP
thinkphp微信开发(消息加密解密)
Dec 02 #PHP
thinkphp微信开之安全模式消息加密解密不成功的解决办法
Dec 02 #PHP
PHP接收json 并将接收数据插入数据库的实现代码
Dec 01 #PHP
实例讲解yii2.0在php命令行中运行的步骤
Dec 01 #PHP
PHP简单的MVC框架实现方法
Dec 01 #PHP
You might like
从零开始学YII2框架(一)通过Composer安装Yii2框架
2014/08/20 PHP
使用PHPMailer发送邮件实例
2017/02/15 PHP
用正则xmlHttp实现的偷(转)
2007/01/22 Javascript
js实现页面打印功能实例代码(附去页眉页脚功能代码)
2009/12/15 Javascript
IE 当eval遇上function的处理
2011/08/09 Javascript
qTip2 精致的基于jQuery提示信息插件
2012/02/17 Javascript
超棒的响应式布局jQuery插件Freetile.js
2014/11/17 Javascript
javascript简单比较日期大小的方法
2016/01/05 Javascript
JS简单实现禁止访问某个页面的方法
2016/09/13 Javascript
Node.js + Redis Sorted Set实现任务队列
2016/09/19 Javascript
AngularJS入门教程之MVC架构实例分析
2016/11/01 Javascript
Vue组件tree实现树形菜单
2017/04/13 Javascript
解决浏览器会自动填充密码的问题
2017/04/28 Javascript
underscore之function_动力节点Java学院整理
2017/07/11 Javascript
Javascript中 toFixed四舍六入方法
2017/08/21 Javascript
Vue2.0 v-for filter列表过滤功能的实现
2018/09/07 Javascript
利用Vue的v-for和v-bind实现列表颜色切换
2020/07/17 Javascript
[04:44]显微镜下的DOTA2第二期——你所没有注意到的细节
2014/06/20 DOTA
[01:09:19]DOTA2-DPC中国联赛 正赛 VG vs Aster BO3 第二场 2月28日
2021/03/11 DOTA
python基础教程之字典操作详解
2014/03/25 Python
python使用wmi模块获取windows下的系统信息 监控系统
2015/10/27 Python
Python3.4学习笔记之类型判断,异常处理,终止程序操作小结
2019/03/01 Python
Python实现二叉树的常见遍历操作总结【7种方法】
2019/03/06 Python
Django如何简单快速实现PUT、DELETE方法
2019/07/24 Python
CSS3实现可关闭的下拉手风琴菜单效果
2015/08/31 HTML / CSS
ghd法国官方网站:英国最受欢迎的美发工具品牌
2019/04/18 全球购物
现代绅士日常奢侈品:Todd Snyder
2019/12/13 全球购物
童装店创业计划书
2014/01/09 职场文书
工程管理专业毕业生自荐信
2014/01/24 职场文书
庆祝教师节活动方案
2014/01/31 职场文书
低碳环保倡议书
2014/04/14 职场文书
高中学校对照检查材料
2014/08/31 职场文书
四风问题专项整治工作情况报告
2014/10/28 职场文书
施工单位工程部经理岗位职责
2015/04/09 职场文书
学生会工作感言
2015/08/07 职场文书
创业计划书之花店
2019/09/20 职场文书