回复 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; }