百度笔度题-----蚂蚁爬杆问题
2009-06-04 13:10
591 查看
从网上搜了一道:
/*
题目描述:
/*百度面试题
* 有一根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的方向为:
向右 向左 向左 向左 向左
/*
题目描述:
/*百度面试题
* 有一根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的方向为:
向右 向左 向左 向左 向左
相关文章推荐
- 每天一道编程题------------百度蚂蚁爬杆问题
- 编程之美4.7蚂蚁爬杆扩展问题附猎人抓狐狸(必胜策略)
- 百度面试题(著名的蚂蚁问题)
- 百度面试题一道2(著名的蚂蚁问题)
- 《编程之美》蚂蚁爬杆问题的扩展
- 【原创】蚂蚁爬杆问题之java实现
- 【经典问题】蚂蚁爬杆问题
- 蚂蚁爬杆问题
- 百度面试题——蚂蚁爬杆
- 蚂蚁爬杆问题
- 蚂蚁爬杆问题
- 《编程之美》蚂蚁爬杆问题的扩展【1】
- 百度面试题——蚂蚁爬杆答案
- 《编程之美》蚂蚁爬杆问题的扩展【1】
- 蚂蚁爬杆问题分析
- java求解蚂蚁爬杆问题(面向对象 暴力解法)
- 编程之美:蚂蚁爬杆问题的扩展
- 《编程之美》蚂蚁爬杆问题的扩展
- 蚂蚁爬杆问题(Java面向对象)