从网上搜了一道:
/*
题目描述:
/*百度面试题
* 有一根27厘米的细木杆,在第3厘米、7厘米、11厘米、17厘米、23厘米这五个位置上各有一只蚂蚁。
* 木杆很细,不能同时通过一只蚂蚁。开始 时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头,
* 但不会后退。当任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走。假设蚂蚁们每秒钟可以走一厘米的距离。
* 编写程序,求所有蚂蚁都离开木杆 的最小时间和最大时间。
*/
#include<iostream>
#include<algorithm>
using namespace std;
//蚂蚁移动的方向,1为向右,-1为向左
int direction[5]={-1,-1,1,-1,1};
float f(){
int temp_dir[5];
copy(direction,direction+5,temp_dir);
float time=0;
int remains=5;
float pos[5]={3,7,11,17,23};
int start=0;
int end=4;
while(remains>0){
time+=0.5;
for(int i=start;i<=end;i++){
pos[i]+=direction[i]*0.5;
}
for(int i=start;i<=end-1;i++){
if(pos[i]==pos[i+1]){
temp_dir[i]=-temp_dir[i];
temp_dir[i+1]=-temp_dir[i+1];
}
}
if(pos[start]<=0||pos[start]>=27){
start++;
remains--;
}
if(pos[end]<0||pos[end]>27){
end--;
remains--;
}
}
//cout<<time;
return time;
}
float _min=1000;
float _max=-1;
int min_dir[5];
int max_dir[5];
void cal(int i){
if(i==5){
float result=f();
if(result<_min){
_min=result;
copy(direction,direction+5,min_dir);
}
if(result>_max){
_max=result;
copy(direction,direction+5,max_dir);
}
return;
}else{
direction[i]=-1;
cal(i+1);
direction[i]=1;
cal(i+1);
}
}
int main(){
cal(0);
cout<<"min:"<<_min<<endl<<"max:"<<_max<<endl;
ostream_iterator<int> os(cout," ");
copy(max_dir,max_dir+5,os);
cout<<endl;
}
题目描述:
/*百度面试题
* 有一根27厘米的细木杆,在第3厘米、7厘米、11厘米、17厘米、23厘米这五个位置上各有一只蚂蚁。
* 木杆很细,不能同时通过一只蚂蚁。开始 时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头,
* 但不会后退。当任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走。假设蚂蚁们每秒钟可以走一厘米的距离。
* 编写程序,求所有蚂蚁都离开木杆 的最小时间和最大时间。
*/
#include<iostream>
#include<algorithm>
using namespace std;
//蚂蚁移动的方向,1为向右,-1为向左
int direction[5]={-1,-1,1,-1,1};
float f(){
int temp_dir[5];
copy(direction,direction+5,temp_dir);
float time=0;
int remains=5;
float pos[5]={3,7,11,17,23};
int start=0;
int end=4;
while(remains>0){
time+=0.5;
for(int i=start;i<=end;i++){
pos[i]+=direction[i]*0.5;
}
for(int i=start;i<=end-1;i++){
if(pos[i]==pos[i+1]){
temp_dir[i]=-temp_dir[i];
temp_dir[i+1]=-temp_dir[i+1];
}
}
if(pos[start]<=0||pos[start]>=27){
start++;
remains--;
}
if(pos[end]<0||pos[end]>27){
end--;
remains--;
}
}
//cout<<time;
return time;
}
float _min=1000;
float _max=-1;
int min_dir[5];
int max_dir[5];
void cal(int i){
if(i==5){
float result=f();
if(result<_min){
_min=result;
copy(direction,direction+5,min_dir);
}
if(result>_max){
_max=result;
copy(direction,direction+5,max_dir);
}
return;
}else{
direction[i]=-1;
cal(i+1);
direction[i]=1;
cal(i+1);
}
}
int main(){
cal(0);
cout<<"min:"<<_min<<endl<<"max:"<<_max<<endl;
ostream_iterator<int> os(cout," ");
copy(max_dir,max_dir+5,os);
cout<<endl;
}
运行结果:
min:11
max:24.5
max的方向为:
向右 向左 向左 向左 向左