解微软题

来源:互联网 发布:网络摄像头数据采集 编辑:程序博客网 时间:2024/05/02 01:28
/********************************************************************
*  文件名:        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();
}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 头不自觉向右偏怎么办 靠墙站立腰疼怎么办 小腿酸痛乏力肌肉萎缩怎么办 搬重物后手臂疼怎么办 和尚鹦鹉吃了盐怎么办 刚买鹦鹉不上手怎么办 word的文件时间改了怎么办 图强gps编码丢失怎么办 武统台湾后岛民怎么办 没有你我怎么办是什么歌 ios 12软件闪退怎么办 来大姨妈想吐怎么办 3岁宝宝体重轻怎么办 硕士延期毕业考上博士怎么办 中国人移民欧洲饮食不习惯怎么办 出车祸了报警警察不管怎么办 高中的孩子不好好上学怎么办 和老公消费观念不合拍怎么办 去医院没带现金怎么办 微信读书下架了怎么办 24岁血压有点高怎么办 吃鸡鼠标弹出来怎么办 电脑分辨率调错了怎么办 猎豹sc9打不开门怎么办 苹果手机卡顿反应慢怎么办 金立手机卡顿反应慢怎么办 20天宝宝黄疸219怎么办? 智慧树选修挂科怎么办 军人被纠察抓了怎么办 我家的小孩很凶怎么办 10岁儿童老挤眼怎么办? 脚趾长鸡眼好痛怎么办 月加班超过36小时怎么办 月经老提前怎么办才好 20岁例假不规律怎么办 农村的医保门诊封顶了怎么办 保研夏令营被拒怎么办 小学生去英国游学怎么办签证 医生说我湿气重怎么办 喉咙痛有来医生感冒喉咙痛怎么办 暴马丁香叶子卷怎么办