微软飞机题

/********************************************************************
*  文件名:        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();
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值