标题:百度的一道面试题(5只蚂蚁爬木棍)
只看楼主
lintaoyn
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:605
专家分:2489
注 册:2009-4-8
得分:0 
回复 10楼 kingsroot
是么~可能咱们在什么才算爬出去的问题上有出入~我的结果比你多了一秒~我定义的“木棍的长度是29~~”

迭代的是人,递归的是神。
2010-11-10 14:58
kingsroot
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:284
专家分:1159
注 册:2010-3-28
得分:0 
回复 11楼 lintaoyn
蚂蚁可以从棍子2头爬出去哦!不是只限于一头哦
2010-11-10 15:37
lintaoyn
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:605
专家分:2489
注 册:2009-4-8
得分:0 
嗯…我错了,没写注释是我的错。学好英语单词

迭代的是人,递归的是神。
2010-11-10 15:52
ljt
Rank: 6Rank: 6
等 级:侠之大者
威 望:3
帖 子:191
专家分:431
注 册:2009-4-6
得分:0 
回复 3楼 kingsroot
stdint.h这个还真的没见过,查了下还和vc6.0不兼容,要vs才行
2010-11-10 18:26
kingsroot
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:284
专家分:1159
注 册:2010-3-28
得分:0 
回复 14楼 ljt
我在Linux环境下的!!
2010-11-10 20:28
玩出来的代码
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:河南新乡
等 级:贵宾
威 望:11
帖 子:742
专家分:2989
注 册:2009-10-12
得分:0 
楼上各位写的没个说明的,看着累,有个思路也行的。
两个蚂蚁相撞时需要反向走,那就先判断那两个蚂蚁会相撞吧,
设置标志,向左走为0,向右走位1,设置首次相撞时的条件为,这对蚂蚁中第一个蚂蚁向右走,第二个向左走
并且在所有的符合向右向左走的蚂蚁对中之间的距离最短,
第一步先找符合方向的蚂蚁对计算之间的距离,找出距离最短的蚂蚁对,另外可能有不只一对的蚂蚁符合条件
也就是可能在同一时刻有两对蚂蚁相撞,那就得将他们都记录下来,设置一vector,记录符合情况的蚂蚁对中的第一个蚂蚁的信息
第二个就不用记录了,看程序,Mindist记录下最短距离

根据Mindist调整各个蚂蚁在木杆上的位置,若蚂蚁向左走则用自己当前的位置减去Mindist,若向右则加上Mindist,同时设置相撞的蚂蚁对的方向,取反就行了,其他的蚂蚁反向不变,这需要在上一步中vector的记录中查找,此时若有蚂蚁向左走走到了0,或向右走到了27,就将其dist设置为0下次就不用判断了,
虽然有个类的但只是对数据进行简单的封装,主要功能的事项还是在外面的函数中,也方便。
另外效率也是一个值得思考的问题
写的可能有点乱了,刚才写了一堆,不小心删了
重复上述步骤。大致就是这了,详细看代码吧。

离恨恰如春草,更行更远还生。
2010-11-10 20:35
玩出来的代码
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:河南新乡
等 级:贵宾
威 望:11
帖 子:742
专家分:2989
注 册:2009-10-12
得分:4 
代码不见了。在贴下看看
程序代码:
#include<iostream>
#include<vector>
#include<string>
#include<functional>
#include<algorithm>
using namespace std;
class Ant
{
public:
    Ant(int _dist,bool _dirct)
    {
        dist=_dist;
        dirct=_dirct;
        time=0;
    }
    void ChangeValue(int i,bool j,int k)
    {
        dist+=i;
        dirct=!j;
        time+=k;
    }
    int& GetDist()
    {
        return dist;
    }
    bool GetDirct()
    {
        return dirct;
    }
    int& GetTime()
    {
        return time;
    }
public:
    static int totletime;    //所有蚂蚁离开木杆的时间,这个也可以没有
private:
    int dist;    //位置
    bool dirct;    //反向
    int time;    //离开木杆所用的时间
    
};
int Ant::totletime=0;

void Modify(vector<Ant>::iterator begin,int Mindist)
{
    if(begin->GetDist()<=0)
    {
        begin->GetTime()-=abs(begin->GetDist());
        begin->GetDist()=0;
    }
    else if(begin->GetDist()>=27)
    {
        begin->GetTime()-=(begin->GetDist()-27);
        begin->GetDist()=0;
    }
}

template<typename T>
class Myequal_to: public binary_function<T,T,bool>
{
public:
    bool operator()(const T& x,const T& y)const
    {
        return x==y;
    }
};


bool Solve(vector<Ant>::iterator first,vector<Ant>::iterator last)
{
    vector<Ant>::iterator old=first,begin=first;
    vector<vector<Ant>::iterator> iter;
    int Mindist=27,Mintmp;
    while(++first!=last)
    {
        Mintmp=28;//当距离不为0,第一个蚂蚁向由(为1),
        if(old->GetDist()!=0 && first->GetDist()!=0 && old->GetDirct() && !first->GetDirct())
        {
            Mintmp=abs(old->GetDist()-first->GetDist());
        }
        if(Mindist>=Mintmp)
        {
            if(Mindist==27 || Mindist==Mintmp) 
            {
                iter.push_back(old);//第一次进入时,或有距离相同的蚂蚁对
            }
            else //若有距离最小的记录,清空先前的,重新设置
            {
                iter.clear();
                iter.push_back(old);
            }
            Mindist=Mintmp;
        }
        old=first;
    }
    if(Mindist!=0 && Mindist!=27)
    {
        Mindist>>=1;    //距离/2
        while(begin!=last)
        {
            if(begin->GetDist()==0)     //为0不处理
            {
                begin++;
                continue;
            }//在第一步中设置的vector中查找
            if(find_if(iter.begin(),iter.end(),bind2nd(Myequal_to<vector<Ant>::iterator>(),begin))==iter.end())
            {
                begin->ChangeValue(Mindist=begin->GetDirct()?abs(Mindist):-abs(Mindist),!begin->GetDirct(),abs(Mindist));
                Modify(begin,Mindist);
            }
            else
            {        //设置符合条件的蚂蚁对的第一个蚂蚁的信息
                begin->ChangeValue(abs(Mindist),begin->GetDirct(),abs(Mindist));
                Modify(begin,Mindist);
                begin++;//调整第二个蚂蚁的信息
                begin->ChangeValue(-abs(Mindist),begin->GetDirct(),abs(Mindist));
                Modify(begin,Mindist);
            }
            begin++;
        }
        Ant::totletime+=abs(Mindist);
        return true;
    }
    return false;
}


int GetMaxDist(vector<Ant>::iterator first,vector<Ant>::iterator last)
{
        //计算所有未走出木杆的蚂蚁走出木杆所需要的时间,此时个蚂蚁所对应的dist就是蚂蚁在木杆上的位置
    //并且不会再相撞了
    int LeftMax=0,RightMax=0;
    while(first!=last)
    {
        if(first->GetDist()!=0)
        {
            if(first->GetDirct()==0)
            {
                first->GetTime()+=first->GetDist();
                LeftMax=LeftMax<first->GetDist()?first->GetDist():LeftMax;
            }
            else 
            {
                first->GetTime()+=27-first->GetDist();
                RightMax=RightMax<27-first->GetDist()?27-first->GetDist():RightMax;
            }
        }
        first++;
    }
    return LeftMax<RightMax?RightMax:LeftMax;
}


int main()
{
    vector<Ant> vec;
    int dist,dirct;
    for(int i=0;i<5;i++)//输入时按照从小到大输入
    {
        cin>>dist>>dirct;
        vec.push_back(Ant(dist,dirct));
    }
    while(1)
    {
        if(!Solve(vec.begin(),vec.end()))  //循环调用步骤1,2
            break;
    }
    cout<<Ant::totletime<<endl;
    Ant::totletime+=GetMaxDist(vec.begin(),vec.end());
    for(size_t j=0;j!=vec.size();j++)
    {
        cout<<vec[j].GetTime()<<' ';
    }
    cout<<Ant::totletime<<endl;
    return 0;
}


[ 本帖最后由 玩出来的代码 于 2010-11-10 20:38 编辑 ]

离恨恰如春草,更行更远还生。
2010-11-10 20:36
longzhixuan
Rank: 1
等 级:新手上路
帖 子:10
专家分:2
注 册:2010-10-8
得分:0 
多谢各位啊!
2010-11-10 21:38
longzhixuan
Rank: 1
等 级:新手上路
帖 子:10
专家分:2
注 册:2010-10-8
得分:0 
再说声感谢各位,开始时弄的分少了,没有给上分的大侠,希望别介意!感谢给位!学习了!
2010-11-10 21:42
ljp200901284
该用户已被删除
得分:0 
回复 2楼 lintaoyn
提示: 作者被禁止或删除 内容自动屏蔽
2010-11-14 18:49



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-325410-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 1.326116 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved