回复 10楼 kingsroot
是么~可能咱们在什么才算爬出去的问题上有出入~我的结果比你多了一秒~我定义的“木棍的长度是29~~”

迭代的是人,递归的是神。


代码不见了。在贴下看看
程序代码:
#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;
}
