/********************************************************************
* 文件名: micosoft.h
* 文件描述: 解微软面试题
* 创建人: 陈泽丹, 2006年3月26日
* 版本号: 1.0
* 修改记录:
********************************************************************/
/*-------------------------------------------------------------------
问题介绍:
每个飞机只有一个油箱,飞机之间可以相互加油(注意是相互,没有加油机),一箱油可供一架飞机绕地球飞半圈。
问:为使至少一架飞机绕地球一圈回到起飞时的飞机场,至少需要出动几架飞机?
(所有飞机从同一机场起飞,而且必须都安全返回机场,不允许中途降落,中间没有飞机场)
解题思路:
递归方案。设最终有一架能飞完全一圈,而一架最多装油半圈,故它需
要补充半圈油。羊毛出在羊身上,我们来找那头羊好了。这半圈油当然
出在别的飞机身上,而别的飞机又抽别别的飞机。。。递归终止条件:当某一架
飞机被抽完其它飞机“仅仅所需的油”后,它还能安全飞回基地。递归结束。
具体细节:
一架飞机在1/4全程点上如能满油(即得到1/4的补充量),它就能飞回。因为3/4点
同样可补到1/4的量(注意地球是圆的,可两边补)。 那么1/4全程点时它可抽其
它飞机的,然后它可飞回了,但然后其它飞机飞不回怎么办呢?再用解决刚才
那"飞全程飞机的方法"来解决其它飞机,递归下去...直到有飞机被人抽后还能
够油飞回基地。(注意每次补充量只需它总的补充量的一半就行哦)
--------------------------------------------------------------------*/
/*================== ==================
==================
=============
Max 最大加油量 (注意在本题时加油量的单位就是路途,故全程是2,则
半圆为1,即最大加油量为1)
journey: 需飞的路程
oil: 本身被其它抽油后的存油量
fly(): 调用飞机的函数
count 计量飞机数。
================= ==================
==================
===============*/
#include <iostream.h>
int count=0;
void fly(double x, double y)
{
if ( x-y>0 )
{
count++;
fly(x-y,1-0.5*(x-y));
}
}
void start()
{
cout<<"问题介绍:"<<endl;
cout<<"这是网上流传的微软面试题里的最后一道.每个飞机只有一个油箱,飞机之间"<<endl;
cout<<"可以相互加油(注意是相互,没有加油机),"<<endl;
cout<<"一箱油可供一架飞机绕地球飞半圈。"<<endl;
cout<<"问:为使至少一架飞机绕地球一圈回到起飞时的飞机场,至少需要出动几架飞机?"<<endl;
cout<<"(所有飞机从同一机场起飞,而且必须都安全返回机场,不允许中途降落,中间"<<endl;
cout<<"没有飞机场) "<<endl;
cout<<endl;
cout<<"解题思路:"<<endl;
cout<<"递归方案。设最终有一架能飞完全一圈,而一架最多装油半圈,故它需"<<endl;
cout<<"要补充半圈油。羊毛出在羊身上,我们来找那头羊好了,嘻嘻。这半圈油当然"<<endl;
cout<<"出在别的飞机身上,而别的飞机又抽别别的飞机。。。递归终止条件:当某一架"<<endl;
cout<<"飞机被抽完其它飞机“仅仅所需的油”后,它还能安全飞回基地。递归结束。"<<endl;
cout<<"具体细节: "<<endl;
cout<<"一架飞机在1/4全程点上如能满油(即得到1/4的补充量),它就能飞回。因为3/4点"<<endl;
cout<<"同样可补到1/4的量(注意地球是圆的,可两边补)。 那么1/4全程点时它可抽其"<<endl;
cout<<"它飞机的,然后它可飞回了,但然后其它飞机飞不回怎么办呢?再用解决刚才"<<endl;
cout<<"那/"飞全程飞机的方法/"来解决其它飞机,递归下去...直到有飞机被人抽后还能"<<endl;
cout<<"够油飞回基地。(注意每次补充量只需它总的补充量的一半就行哦) "<<endl;
cout<<"================== ==================
==================
==================
="<<endl;
cout<<endl;
count++;
cout<<"程序运行结果: ";
fly(2,1);
cout<<count<<endl;
cout<<"------------------------------------------------------------------------"<<endl;
cout<<"附录(飞机的具体飞行过程):"<<endl;
cout<<"--->时间轴(单位时间等于走飞行半周的时间) (行动方向前的数字表油量,"<<endl;
cout<<"‘->’左边为到达该时间点时存油量,右边为抽或加油后的存油量(有加油现象 "<<endl;
cout<<"的才有这个符号) )"<<endl;
cout<<" 0 1/4 2/4 "<<endl;
cout<<"A 1飞出 (3/4->2/4)飞回 1基地飞出 "<<endl;
cout<<"B 1飞出 (3/4->1) 飞出 (3/4->1/4)飞回 "<<endl;
cout<<"C 1飞出 3/4 飞出 (2/4->1)飞出 "<<endl;
cout<<" 3/4 1 5/4 "<<endl;
cout<<"A (3/4->2/4)飞回 1基地飞出(另半球) (3/4->2/4)飞回 "<<endl;
cout<<"B (0->1/4)飞回 1基地飞出(另半球) (3/4->1) 飞出"<<endl;
cout<<"C 3/4飞出 1/2飞出(另半球) 1/4飞出 "<<endl;
cout<<" 6/4 7/4 8/4 "<<endl;
cout<<"A 1基地飞出 (3/4->2/4)飞回 回到起点 "<<endl;
cout<<"B (3/4->1/4)飞回 (0->1/4)飞回 回到起点 "<<endl;
cout<<"C (0->1/2)飞出 1/4飞出 回到起点 "<<endl;
cout<<"以上是三架飞机飞完全程的全过程(注:飞出飞回是相对飞机原来的"<<endl;
cout<<"位置而定的.其中的数据是按照我那递归程序运行思路所求所得的"<<endl;
cout<<"-------------------------------------------------------------------"<<endl;
}
void main()
{
start();
}
* 文件名: micosoft.h
* 文件描述: 解微软面试题
* 创建人: 陈泽丹, 2006年3月26日
* 版本号: 1.0
* 修改记录:
********************************************************************/
/*-------------------------------------------------------------------
问题介绍:
每个飞机只有一个油箱,飞机之间可以相互加油(注意是相互,没有加油机),一箱油可供一架飞机绕地球飞半圈。
问:为使至少一架飞机绕地球一圈回到起飞时的飞机场,至少需要出动几架飞机?
(所有飞机从同一机场起飞,而且必须都安全返回机场,不允许中途降落,中间没有飞机场)
解题思路:
递归方案。设最终有一架能飞完全一圈,而一架最多装油半圈,故它需
要补充半圈油。羊毛出在羊身上,我们来找那头羊好了。这半圈油当然
出在别的飞机身上,而别的飞机又抽别别的飞机。。。递归终止条件:当某一架
飞机被抽完其它飞机“仅仅所需的油”后,它还能安全飞回基地。递归结束。
具体细节:
一架飞机在1/4全程点上如能满油(即得到1/4的补充量),它就能飞回。因为3/4点
同样可补到1/4的量(注意地球是圆的,可两边补)。 那么1/4全程点时它可抽其
它飞机的,然后它可飞回了,但然后其它飞机飞不回怎么办呢?再用解决刚才
那"飞全程飞机的方法"来解决其它飞机,递归下去...直到有飞机被人抽后还能
够油飞回基地。(注意每次补充量只需它总的补充量的一半就行哦)
--------------------------------------------------------------------*/
/*==================
Max 最大加油量 (注意在本题时加油量的单位就是路途,故全程是2,则
半圆为1,即最大加油量为1)
journey: 需飞的路程
oil: 本身被其它抽油后的存油量
fly(): 调用飞机的函数
count 计量飞机数。
=================
#include <iostream.h>
int count=0;
void fly(double x, double y)
{
if ( x-y>0 )
{
count++;
fly(x-y,1-0.5*(x-y));
}
}
void start()
{
cout<<"问题介绍:"<<endl;
cout<<"这是网上流传的微软面试题里的最后一道.每个飞机只有一个油箱,飞机之间"<<endl;
cout<<"可以相互加油(注意是相互,没有加油机),"<<endl;
cout<<"一箱油可供一架飞机绕地球飞半圈。"<<endl;
cout<<"问:为使至少一架飞机绕地球一圈回到起飞时的飞机场,至少需要出动几架飞机?"<<endl;
cout<<"(所有飞机从同一机场起飞,而且必须都安全返回机场,不允许中途降落,中间"<<endl;
cout<<"没有飞机场) "<<endl;
cout<<endl;
cout<<"解题思路:"<<endl;
cout<<"递归方案。设最终有一架能飞完全一圈,而一架最多装油半圈,故它需"<<endl;
cout<<"要补充半圈油。羊毛出在羊身上,我们来找那头羊好了,嘻嘻。这半圈油当然"<<endl;
cout<<"出在别的飞机身上,而别的飞机又抽别别的飞机。。。递归终止条件:当某一架"<<endl;
cout<<"飞机被抽完其它飞机“仅仅所需的油”后,它还能安全飞回基地。递归结束。"<<endl;
cout<<"具体细节: "<<endl;
cout<<"一架飞机在1/4全程点上如能满油(即得到1/4的补充量),它就能飞回。因为3/4点"<<endl;
cout<<"同样可补到1/4的量(注意地球是圆的,可两边补)。 那么1/4全程点时它可抽其"<<endl;
cout<<"它飞机的,然后它可飞回了,但然后其它飞机飞不回怎么办呢?再用解决刚才"<<endl;
cout<<"那/"飞全程飞机的方法/"来解决其它飞机,递归下去...直到有飞机被人抽后还能"<<endl;
cout<<"够油飞回基地。(注意每次补充量只需它总的补充量的一半就行哦) "<<endl;
cout<<"==================
cout<<endl;
count++;
cout<<"程序运行结果: ";
fly(2,1);
cout<<count<<endl;
cout<<"------------------------------------------------------------------------"<<endl;
cout<<"附录(飞机的具体飞行过程):"<<endl;
cout<<"--->时间轴(单位时间等于走飞行半周的时间) (行动方向前的数字表油量,"<<endl;
cout<<"‘->’左边为到达该时间点时存油量,右边为抽或加油后的存油量(有加油现象 "<<endl;
cout<<"的才有这个符号) )"<<endl;
cout<<" 0 1/4 2/4 "<<endl;
cout<<"A 1飞出 (3/4->2/4)飞回 1基地飞出 "<<endl;
cout<<"B 1飞出 (3/4->1) 飞出 (3/4->1/4)飞回 "<<endl;
cout<<"C 1飞出 3/4 飞出 (2/4->1)飞出 "<<endl;
cout<<" 3/4 1 5/4 "<<endl;
cout<<"A (3/4->2/4)飞回 1基地飞出(另半球) (3/4->2/4)飞回 "<<endl;
cout<<"B (0->1/4)飞回 1基地飞出(另半球) (3/4->1) 飞出"<<endl;
cout<<"C 3/4飞出 1/2飞出(另半球) 1/4飞出 "<<endl;
cout<<" 6/4 7/4 8/4 "<<endl;
cout<<"A 1基地飞出 (3/4->2/4)飞回 回到起点 "<<endl;
cout<<"B (3/4->1/4)飞回 (0->1/4)飞回 回到起点 "<<endl;
cout<<"C (0->1/2)飞出 1/4飞出 回到起点 "<<endl;
cout<<"以上是三架飞机飞完全程的全过程(注:飞出飞回是相对飞机原来的"<<endl;
cout<<"位置而定的.其中的数据是按照我那递归程序运行思路所求所得的"<<endl;
cout<<"-------------------------------------------------------------------"<<endl;
}
void main()
{
start();
}