正文

 经典的递归题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);
}    

阅读(4600) | 评论(0)


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

评论

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