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