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测试程序运行时间的类
Feb 05 PHP
php 操作符与控制结构
Mar 07 PHP
PHP面向对象学习笔记之二 生成对象的设计模式
Oct 06 PHP
在smarty中调用php内置函数的方法
Feb 07 PHP
php中filter函数验证、过滤用户输入的数据
Jan 13 PHP
PHP实现HTML生成PDF文件的方法
Nov 07 PHP
PHP中的密码加密的解决方案总结
Oct 26 PHP
thinkPHP框架对接支付宝即时到账接口回调操作示例
Nov 14 PHP
由php中字符offset特征造成的绕过漏洞详解
Jul 07 PHP
PHP实现链式操作的三种方法详解
Nov 16 PHP
php中html_entity_decode实现HTML实体转义
Jun 13 PHP
php-fpm.conf配置文件中文说明详解及重要参数说明
Oct 10 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
星际争霸 Starcraft 发展史
2020/03/14 星际争霸
PHP 数组教程 定义数组
2009/10/23 PHP
Yii2实现ajax上传图片插件用法
2016/04/28 PHP
php+flash+jQuery多图片上传源码分享
2020/07/27 PHP
PHP实现的堆排序算法详解
2017/08/17 PHP
Laravel5.1 框架数据库操作DB运行原生SQL的方法分析
2020/01/07 PHP
动态创建的表格单元格中的事件实现代码
2008/12/30 Javascript
使用jquery为table动态添加行的实现代码
2011/03/30 Javascript
详解页面滚动值scrollTop在FireFox与Chrome浏览器间的兼容问题
2015/12/03 Javascript
Angularjs 自定义服务的三种方式(推荐)
2016/08/02 Javascript
jQuery EasyUI datagrid在翻页以后仍能记录被选中行的实现代码
2016/08/15 Javascript
原生js实现网易轮播图效果
2020/04/10 Javascript
解析JavaScript数组方法reduce
2016/12/12 Javascript
JS实现合并json对象的方法
2017/10/10 Javascript
JS实现碰撞检测的方法分析
2018/01/19 Javascript
JavaScript查看代码运行效率console.time()与console.timeEnd()用法
2019/01/18 Javascript
微信小程序canvas截取任意形状的实现代码
2020/01/13 Javascript
js实现自定义右键菜单
2020/05/18 Javascript
vscode中Vue别名路径提示的实现
2020/07/31 Javascript
[59:15]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第一场 11.20
2020/11/20 DOTA
[55:35]DOTA2-DPC中国联赛 正赛 CDEC vs Dragon BO3 第二场 1月22日
2021/03/11 DOTA
Python备份目录及目录下的全部内容的实现方法
2016/06/12 Python
Python 实现子类获取父类的类成员方法
2019/01/11 Python
Python求离散序列导数的示例
2019/07/10 Python
解决win7操作系统Python3.7.1安装后启动提示缺少.dll文件问题
2019/07/15 Python
使用APScheduler3.0.1 实现定时任务的方法
2019/07/22 Python
pycharm第三方库安装失败的问题及解决经验分享
2020/05/09 Python
一款纯css3实现的动画加载导航
2014/10/08 HTML / CSS
html5 canvas里绘制椭圆并保持线条粗细均匀的技巧
2013/03/25 HTML / CSS
夏威夷航空官网:Hawaiian Airlines
2016/09/11 全球购物
Yummie官方网站:塑身衣和衣柜必需品
2019/10/29 全球购物
德国滑雪和户外用品网上商店:XSPO
2019/10/30 全球购物
英国第一独立滑雪板商店:The Snowboard Asylum
2020/01/16 全球购物
新闻系毕业生推荐信
2013/11/16 职场文书
客户接待方案
2014/02/26 职场文书
初三化学教学反思
2016/02/22 职场文书