有这么一道题目, 看下面的图, 假设有一条直线, 每个叉叉上有一只蚂蚁, 它们会随机选择一个方向, 向前或者向后移动, 每次走一格, 前进中当两只蚂蚁相遇, 它们会掉头, 问: 全部蚂蚁都走出去的最长和最短步数;

最短步数很明显...只要方向对了, 就是11;

最长呢...在看到问题时脑子里第一个反应是: 没有储存对这类问题的算法, 然后开始模拟蚂蚁行进路线, 发现可能性太多, 简直就是一个分子碰撞大混乱的情形...比如 3向右, 7向左, 11向左, 那样3和7碰撞, 7调头, 会和11碰撞, 然后在调头...脑子内存不够模拟...

然后我准备写一下代码:

// 蚂蚁路线问题: 一条直线上多只蚂蚁, 相遇则反转方向, 计算最长爬行距离
int pts[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
16,17,18,19,20,21,22,23,24,25};
class Ant {
public:
Ant(int p, int d): m_pos(p),m_direction(d) {}
void move(int x) {
if(m_direction > 0)
m_pos += x;
else
m_pos -= x;
}
void turnBack() {
m_direction *= -1;
} int m_pos;
int m_direction;
}; Ant firstMeet(const QList <Ant>& list) {
// all the ants always ascending order
Ant a = list.first();
for (int i = 1; i < list.size(); i++) {
if(a.m_pos == list[i].m_pos)
return a;
}
} void path() {
QList <Ant> aList;
Ant a1(3, 1); aList.append(a1);
Ant a2(7, 1); aList.append(a2);
Ant a3(11, 1); aList.append(a3);
Ant a4(16, -1); aList.append(a4);
Ant a5(20, -1); aList.append(a5); bool antsLeave = false;
while (antsLeave) { }
}

花了几分钟写到这里的时候, 停下来考虑要给Ant id, 给各种方向做所有的情况遍历...考虑有不只一对蚂蚁同时相遇的情况等等等等...我突然醒悟了....这不是程序题目, 如果你脑洞大一些, 就能明白, 最大值就是那个离开目标最远的蚂蚁要走的步数, 这里是22, 不劳烦计算机把所有case尝试一遍了;

[Puzzle] 蚂蚁路线碰撞问题的更多相关文章

  1. [ACM_模拟] UVA 10881 Piotr's Ants[蚂蚁移动 数组映射 排序技巧]

    "One thing is for certain: there is no stopping them;the ants will soon be here. And I, for one ...

  2. cogs 1456. [UVa 10881,Piotr's Ants]蚂蚁

    1456. [UVa 10881,Piotr's Ants]蚂蚁 ★   输入文件:Ants.in   输出文件:Ants.out   简单对比时间限制:1 s   内存限制:128 MB [题目描述 ...

  3. poj 1852 Ants_贪心

    题目大意:很多的蚂蚁都在长度为L(cm)的膀子上爬行,它们的速度都是1cm/s,到了棒子终端的时候,蚂蚁就会掉下去.如果在爬行途中遇到其他蚂蚁,两只蚂蚁的方向都会逆转.已知蚂蚁在棒子的最初位置坐标,但 ...

  4. 【8.30校内测试】【找规律模拟】【DP】【二分+贪心】

    对于和规律或者数学有关的题真的束手无策啊QAQ 首先发现两个性质: 1.不管中间怎么碰撞,所有蚂蚁的相对位置不会改变,即后面的蚂蚁不会超过前面的蚂蚁或者落后更后面的蚂蚁. 2.因为所有蚂蚁速度一样,不 ...

  5. Codeforces 652F 解题报告

    题意 有n只蚂蚁在长度为m个格子的环上,环上的格子以逆时针编号,每只蚂蚁每秒往它面向的方向移动一格.如果有两只蚂蚁相撞则相互调换方向,问t秒后每只蚂蚁的位置. 题解 首先通过观察可以发现 蚂蚁相撞产生 ...

  6. 【读书笔记】Cracking the Code Interview(第五版中文版)

    导语 所有的编程练习都在牛客网OJ提交,链接: https://www.nowcoder.com/ta/cracking-the-coding-interview 第八章 面试考题 8.1 数组与字符 ...

  7. UVA 10881 Piotr's Ants(模拟)

    题目链接:https://vjudge.net/problem/UVA-10881 其实这道题的关键只有一句话: 当两个蚂蚁因碰撞而掉头的时候,我们完全可以认为是两个点对穿而过. 这时候我们的主要任务 ...

  8. POJ3565

    题目大意: 给定\(n\)个蚂蚁和\(n\)颗苹果树的坐标,要求每个蚂蚁爬到一颗苹果树旁,使得每个蚂蚁路线不相交且路线总长度最小,求每个蚂蚁爬到哪个苹果树旁? 首先假设有两只蚂蚁路径相交,那么这两个蚂 ...

  9. 碰撞的蚂蚁 牛客网 程序员面试金典 C++ Java Python

    碰撞的蚂蚁 牛客网 程序员面试金典 C++ Java Python 题目描述 在n个顶点的多边形上有n只蚂蚁,这些蚂蚁同时开始沿着多边形的边爬行,请求出这些蚂蚁相撞的概率.(这里的相撞是指存在任意两只 ...

随机推荐

  1. 剖析magento中关于Email模板的设置

    public function send()    {        $emailTemplate = Mage::getModel('core/email_template');        // ...

  2. mvc+ef5+easyui实例(1)

    mvc+ef5+easyui 组织机构和员工管理实例 环境:vs2010+sql2008 框架搭建 1,新建mvc4 web应用 2. 3. 系统自动生成的的controllers,和views文件中 ...

  3. 【转】SQL Server查询字段说明

    select c .name, isnull(ETP .value, '') as Des FROM syscolumns c inner join systypes t on c. xusertyp ...

  4. poj1936--暴力解法

    求s1是否是s2的子串. 分析: 例如sequence 和 subsequence . 从头开始比较,s1[0]与s2[0]相同,那么它们下标都可+1,接着比较s1[1]和s2[1],不相同:这时应该 ...

  5. getchar()用法

    getchar() .从缓冲区读走一个字符,相当于清除缓冲区 .前面的scanf()在读取输入时会在缓冲区中留下一个字符'\n'(输入完s[i]的值后按回车键所致),所以如果不在此加一个getchar ...

  6. byte与sbyte的转换

    C#实现byte与sbyte的转换 byte[] mByte; sbyte[] mSByte = new sbyte[mByte.Length]; ; i < mByte.Length; i++ ...

  7. Lucky Sum

    Description Lucky Sum time limit per test: 2 seconds memory limit per test: 256 megabytes input: sta ...

  8. Oracle GoldenGate学习之Goldengate介绍

    Oracle GoldenGate学习之Goldengate介绍 (2012-10-02 17:07:27) 标签: 检查点 数据传输 队列 进程 分类: Goldengate Goldengate介 ...

  9. Javascript 装载和执行

    http://coolshell.cn/articles/9749.html http://www.cnblogs.com/cheche/archive/2011/03/06/1971955.html

  10. poj1565---(数论)skew binary

    /*将数字存储在数组中 #math.h strlen(a)=len sum=0 for(i=0;i<len;i++) sum+=a[i]*(pow(2,len-i)-1)*/ #include ...