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 disk_free_space 返回目录可用空间
May 10 PHP
php中flush()、ob_flush()、ob_end_flush()的区别介绍
Feb 17 PHP
linux系统下php安装mbstring扩展的二种方法
Jan 20 PHP
php汉字转拼音的示例
Feb 27 PHP
PHP把小数转成整数3种方法
Jun 30 PHP
php中的四舍五入函数代码(floor函数、ceil函数、round与intval)
Jul 14 PHP
PHP微信开发之模板消息回复
Jun 24 PHP
PHP实现大数(浮点数)取余的方法
Feb 18 PHP
Laravel学习教程之IOC容器的介绍与用例
Aug 15 PHP
PHP封装的XML简单操作类完整实例
Nov 13 PHP
PHP文件后缀不强制为.php方法
Mar 31 PHP
Laravel框架控制器的request与response用法示例
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
收藏的一个php小偷的核心程序
2007/04/09 PHP
php 文件上传代码(限制jpg文件)
2010/01/05 PHP
php通过baihui网API实现读取word文档并展示
2015/06/22 PHP
javascript+xml技术实现分页浏览
2008/07/27 Javascript
jquery自定义函数的多种方法
2014/01/09 Javascript
用js通过url传参把数据从一个页面传到另一个页面
2014/09/01 Javascript
jQuery实现鼠标双击Table单元格变成文本框及输入内容后更新到数据库的方法
2015/11/25 Javascript
jQuery+ajax的资源回收处理机制分析
2017/01/07 Javascript
javascript 操作cookies详解及实例
2017/02/22 Javascript
JS实现汉字与Unicode码相互转换的方法详解
2017/04/28 Javascript
微信小程序图片自适应支持多图实例详解
2017/06/21 Javascript
详解vue-cil和webpack中本地静态图片的路径问题解决方案
2017/09/27 Javascript
webpack多入口文件页面打包配置详解
2018/01/09 Javascript
使用vue制作探探滑动堆叠组件的实例代码
2018/03/07 Javascript
使用ESLint禁止项目导入特定模块的方法步骤
2019/03/04 Javascript
小程序实现订单倒计时功能
2019/04/23 Javascript
vue 微信扫码登录(自定义样式)
2020/01/06 Javascript
[03:20]次级联赛厮杀超职业 现超级兵对拆世纪大战
2014/10/30 DOTA
python中Genarator函数用法分析
2015/04/08 Python
python制作企业邮箱的爆破脚本
2016/10/05 Python
python fabric实现远程部署
2017/01/05 Python
python回调函数中使用多线程的方法
2017/12/25 Python
python线程中的同步问题及解决方法
2019/08/29 Python
python单向链表的基本实现与使用方法【定义、遍历、添加、删除、查找等】
2019/10/24 Python
python实现简单井字棋游戏
2020/03/04 Python
Python使用socket_TCP实现小文件下载功能
2020/10/09 Python
Python 爬虫批量爬取网页图片保存到本地的实现代码
2020/12/24 Python
StubHub哥伦比亚:购买和出售您的门票
2016/10/20 全球购物
11月升旗仪式讲话稿
2014/02/15 职场文书
体育教师个人的自我评价
2014/02/16 职场文书
销售目标责任书
2014/07/23 职场文书
责任书范本
2014/08/25 职场文书
产品陈列协议书(标准版)
2014/09/17 职场文书
财务科长个人对照检查材料
2014/09/18 职场文书
图文详解matlab原始处理图像几何变换
2021/07/09 Python
MySql数据库触发器使用教程
2022/06/01 MySQL