蚂蚁爬杆问题
来源:互联网 发布:怎样注册中文.手机域名 编辑:程序博客网 时间:2024/06/11 08:44
蚂蚁爬杆问题
本文转自http://blog.chinaunix.net/uid-20766194-id-1850409.html
这个问题来自编程之美这本书。
问题:有一根27厘米的木杆,在第3厘米,7厘米,11厘米,17厘米,23厘米这五个位置上各有一蚂蚁。木杆很细,不能同时通过两个蚂蚁。开始的时候每个蚂蚁的头朝哪边是不确定的,它们只会朝前走或者掉头,但是不会后退。当任意两只蚂蚁碰头的时候,两只蚂蚁会同时调头向相反的方向走。假设蚂蚁们每秒可以走一厘米的距离。编写程序,求所有蚂蚁都离开木杆的最短时间和最长时间‘
解法一:这也许是大多人会想到的方法(哈哈,我刚开始的时候也这样想的)
考虑枚举蚂蚁的初始朝向,模拟每一个蚂蚁的运动来解决问题。
解法二:
考虑,虽然两只蚂蚁碰头后都掉头往相反的方向,但是,可以看作是是两只蚂蚁相遇后,擦肩而过了(看到这里的时候可能很多人就有一种恍然大悟的感觉了吧)。也就是说可以认为蚂蚁的运动独立的,是否有碰头并不是问题的中重点。
这样虽然每个蚂蚁的运动轨迹都与原来的不一样了。但是所有的蚂蚁离开木杆的最短的时间和最长时间是不变的。只需要分别计算每个蚂蚁离开木杆的时间,即可求出所有蚂蚁离开木杆的时间了。
这样,程序只需要遍历所有的蚂蚁,把每个蚂蚁走出木杆的最长时间(蚂蚁朝离自己较远的一端走去),最短时间(蚂蚁朝离自己较近的一端走去)分别求出来,就算出最大值,这两个最大值就是所有蚂蚁离开木杆的最长时间和最短时间。
void get_time( int length, //木杆的长度 int pos[], //开始时候每个蚂蚁的位置 int ant_num, //蚂蚁的数量 int speed, //蚂蚁爬行的速度 int *max, //最长时间 int *min //最短时间 ){ *max = 0; *min = 0; int current_max = 0; int current_min = 0; int i; for (i = 0;i < ant_num;i++) { current_max = 0; current_min = 0; if (pos[i] < length / 2) { current_max = (length - pos[i]) / speed; current_min = pos[i] / speed; } else { current_max = pos[i] / speed; current_min = (length - pos[i]) / speed; } if (*max < current_max) *max = current_max; if (*min < current_min) *min = current_min; }}
扩展问题:
1、第i个蚂蚁什么时间走出木杆。
2、蚂蚁一共碰了多少此头
0 0
- 蚂蚁爬杆问题
- 蚂蚁爬杆问题
- 蚂蚁爬杆问题
- 蚂蚁爬杆问题
- 蚂蚁爬杆问题
- 蚂蚁爬杆问题
- 蚂蚁爬杆问题
- 蚂蚁爬杆问题
- 蚂蚁爬杆问题分析
- 4.7 蚂蚁爬杆问题
- 【经典问题】蚂蚁爬杆问题
- 蚂蚁爬杆问题的java实现
- 蚂蚁爬杆问题的扩展
- 蚂蚁爬杆问题 UVA 10881
- 蚂蚁爬杆问题--面向对象,建模
- 蚂蚁过杆问题
- 蚂蚁爬木杆问题
- 蚂蚁爬竹竿问题
- Xcode SVN "The file can not be opened"
- 越獄之权值非负单源最短路径问题-Dijkstra算法
- Android 颜色Color(转)
- 【ASP.NET】Web中的Cookie写入与读取
- 《深入浅出struts2》--第七章,类型转换-支持与Collection一起使用
- 蚂蚁爬杆问题
- Android图
- PopupWindow点击外部区域消失(二)
- android webView js方法和java 方法交互
- js动态创建多个input框带删除按钮
- android查看进程stack的方法
- 流媒体时代,中国音乐行业的呐喊!
- Web开发、测试环境搭建(LAMP、SVN服务器、Laravel项目创建)
- 求最小公约数(辗转相除法<递归和非递归求法>)