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 相关文章推荐
第十四节--命名空间
Nov 16 PHP
php表单转换textarea换行符的方法
Sep 10 PHP
关于PHP中Object对象的笔记分享
Jun 28 PHP
浅析十款PHP开发框架的对比
Jul 05 PHP
PHP使用递归方式列出当前目录下所有文件的方法
Jun 02 PHP
ThinkPHP路由机制简介
Mar 23 PHP
PHP 返回13位时间戳的实现代码
May 13 PHP
PHP strip_tags() 去字符串中的 HTML、XML 以及 PHP 标签的函数
May 22 PHP
eclipse php wamp配置教程
Jun 30 PHP
PHP 接入微信扫码支付总结(总结篇)
Nov 03 PHP
php获取flash尺寸详细数据的方法
Nov 12 PHP
laravel实现一个上传图片的接口,并建立软链接,访问图片的方法
Oct 12 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比较操作符的安全问题
2015/12/03 PHP
PHP框架Laravel中使用UUID实现数据分表操作示例
2018/05/30 PHP
PHP进阶学习之反射基本概念与用法分析
2019/06/18 PHP
JavaScript是否可实现多线程  深入理解JavaScript定时机制
2009/12/22 Javascript
js 中 document.createEvent的用法
2010/08/29 Javascript
jQuery EasyUI API 中文文档 - Tabs标签页/选项卡
2011/10/01 Javascript
js特效,页面下雪的小例子
2013/06/17 Javascript
ExtJS中设置下拉列表框不可编辑的方法
2014/05/07 Javascript
JavaScript日期时间与时间戳的转换函数分享
2015/01/31 Javascript
jQuery实现自动与手动切换的滚动新闻特效代码分享
2015/08/27 Javascript
javascript中substring()、substr()、slice()的区别
2015/08/30 Javascript
详解JavaScript中双等号引起的隐性类型转换
2016/05/30 Javascript
angular.js分页代码的实例
2016/07/27 Javascript
Javascript实现前端简单的路由实例
2016/09/11 Javascript
JS封装的三级联动菜单(使用时只需要一行js代码)
2016/10/24 Javascript
微信小程序 简单DEMO布局,逻辑,样式的练习
2016/11/30 Javascript
浅谈javascript中的事件冒泡和事件捕获
2016/12/28 Javascript
jQuery+CSS实现的table表格行列转置功能示例
2018/01/08 jQuery
为什么要使用Vuex的介绍
2019/01/19 Javascript
vue 通过绑定事件获取当前行的id操作
2020/07/27 Javascript
[55:35]DOTA2-DPC中国联赛 正赛 CDEC vs Dragon BO3 第二场 1月22日
2021/03/11 DOTA
简单的Apache+FastCGI+Django配置指南
2015/07/22 Python
Django中ORM表的创建和增删改查方法示例
2017/11/15 Python
python随机数分布random测试
2018/08/27 Python
python实现将多个文件分配到多个文件夹的方法
2019/01/07 Python
pycharm配置git(图文教程)
2019/08/16 Python
python中的逆序遍历实例
2019/12/25 Python
基于Django集成CAS实现流程详解
2020/11/28 Python
IE8下CSS3选择器nth-child() 不兼容问题的解决方法
2016/11/16 HTML / CSS
幼师专业求职推荐信
2013/11/08 职场文书
城市精细化管理实施方案
2014/03/04 职场文书
交通事故私了协议书
2014/04/16 职场文书
2014年煤矿工作总结
2014/11/24 职场文书
创业计划书之服装
2019/10/07 职场文书
使用GO语言实现Mysql数据库CURD的简单示例
2021/08/07 Golang
关于@OnetoMany关系映射的排序问题,使用注解@OrderBy
2021/12/06 Java/Android