正文

 经典的递归题2006-04-06 13:10:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/smile/11994.html

分享到:

问题描述:   一位教授逻辑学的教授有三名非常善于推理且精于心算的学生A,B和C。有一天,教授给他们三人出了一道题:教授在每个人脑门上贴了一张纸条并告诉他们,每个人的纸条上都写了一个正整数,且某两个数的和等于第三个.每个学生都能看见贴在另外两个同学头上的整数,但却看不见自已的数。这时,教授先对学生A发问了:“你能猜出自已的数吗?”A回答:“不能。”教授又转身问学生B:“你能猜出你自已的数吗?”B想了想,也回答:“不能。”教授再问学生C同样的问题,C思考了片刻后,摇了摇头:“不能。”接着,教授又重新问A同样的问题,再问B和C,。经过若干轮的提问之后,当教授再问某人时,此人突然露出得意的笑容,把贴在自已头上的那个数准确无误的报了出来。   现在告诉你,教授在第N次提问时,轮到回答问题的那个人猜出了贴在自已头上的数M,你能推断出另外两个学生的头上的贴的是什么数吗?   提示:总是头上贴着最大的那个数的人最先猜出自已头上的数。/**********************************************************************  文件名:        recursion.h*  文件描述:     经典的递归题*  创建人:        Angel  (QQ:317725224)*  版本号:        1.0*  修改记录:*********************************************************************/ #include <iostream.h> const int Max=3; void Init(int a[], int n){ for(int i=1; i<n; i++)  a[i]=i+1; a[i]=1;} int count(int a[], int start, int end){ int c=0; for(int i=start; a[i]!=a[end]; i=a[i])  c++; return c;} int times(int a[], int i, int j, int t1, int t2, int t3){ if(i<j) return times(a,i,j-i,t1,t3,t2)+count(a,t2,t3); else if(i>j) return times(a,i-j,j,t3,t2,t1)+count(a,t1,t3); else return t3;} void answer(int a[], int M, int N){ int k=1;  int t[Max+1];  int i;  for(i=1; i<=Max; i++) t[i]=i;  if(N%Max!=0)  { int temp=t[N%Max]; t[N%Max]=t[3]; t[3]=temp;  }  for(i=1; i<M; i++)  { if(times(a,i,M-i,t[1],t[2],t[3]) == N) {  cout<<i<<" "<<M-i<<endl;  k=0;  cout<<endl; }  }   if(k) cout<<"该条件无解!"<<endl;} void main(){ int a[Max+1]; Init(a,3); int M,N; cout<<"请输入提问次数:"; cin>>N; cout<<"请输入最大数:"; cin>>M; answer(a,M,N);}    

阅读(4638) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册