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面向对象概念
Nov 06 PHP
php fsockopen中多线程问题的解决办法[翻译]
Nov 09 PHP
php轻松实现中英文混排字符串截取
May 28 PHP
PHP以mysqli方式连接类完整代码实例
Jul 15 PHP
PHP的switch判断语句的“高级”用法详解
Oct 01 PHP
简单介绍win7下搭建apache+php+mysql开发环境
Aug 06 PHP
PHP中模拟链表和链表的基本操作示例
Feb 27 PHP
Yii隐藏URL中index.php的方法
Jul 12 PHP
利用PHP判断是否是连乘数字串的方法示例
Jul 03 PHP
Kindeditor编辑器添加图片上传水印功能(php代码)
Aug 03 PHP
ThinkPHP5框架实现简单的批量查询功能示例
Jun 07 PHP
解决laravel查询构造器中的别名问题
Oct 17 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
PHP类中Static方法效率测试代码
2010/10/17 PHP
如何使用php等比例缩放图片
2016/10/12 PHP
YII2框架中behavior行为的理解与使用方法示例
2020/03/13 PHP
兼容IE和Firefox的javascript获取iframe文档内容的函数
2011/08/15 Javascript
提交按钮的name='submit'引起的js失效问题及原因
2015/02/25 Javascript
微信小程序 绘图之饼图实现
2016/10/24 Javascript
详解nodejs爬虫程序解决gbk等中文编码问题
2017/04/06 NodeJs
利用10行js代码实现上下滚动公告效果
2017/12/08 Javascript
jQuery实现form表单序列化转换为json对象功能示例
2018/05/23 jQuery
JavaScript的Object.defineProperty详解
2018/07/09 Javascript
解决angularjs WdatePicker ng-model的问题
2018/09/13 Javascript
详解Node.js 中使用 ECDSA 签名遇到的坑
2018/11/26 Javascript
vue.js仿hover效果的实现方法示例
2019/01/28 Javascript
Vue3.0结合bootstrap创建多页面应用
2019/05/28 Javascript
node.js使用mongoose操作数据库实现购物车的增、删、改、查功能示例
2019/12/23 Javascript
vue 限制input只能输入正数的操作
2020/08/05 Javascript
[43:24]VG vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
使用C#配合ArcGIS Engine进行地理信息系统开发
2016/02/19 Python
总结python爬虫抓站的实用技巧
2016/08/09 Python
Python 实现购物商城,含有用户入口和商家入口的示例
2017/09/15 Python
Python WEB应用部署的实现方法
2019/01/02 Python
Python 把序列转换为元组的函数tuple方法
2019/06/27 Python
HTML5 audio标签使用js进行播放控制实例
2015/04/24 HTML / CSS
澳大利亚宠物商店:Petbarn
2017/11/18 全球购物
德国运动鞋网上商店:Afew Store
2018/01/05 全球购物
Myprotein西班牙官网:欧洲第一大运动营养品牌
2020/02/24 全球购物
大学学习生活感言
2014/01/18 职场文书
上课打牌的检讨书
2014/02/15 职场文书
高中升旗仪式演讲稿
2014/09/09 职场文书
邀请函怎么写
2015/01/30 职场文书
北京故宫导游词
2015/01/31 职场文书
2016年度员工工作表现评语
2015/12/02 职场文书
医院岗前培训心得体会
2016/01/08 职场文书
高二英语教学反思
2016/03/03 职场文书
测量JavaScript函数的性能各种方式对比
2021/04/27 Javascript
JavaWeb 入门篇(3)ServletContext 详解 具体应用
2021/07/16 Java/Android