一道古老的智力题

大一暑假,从今开始踏入算法路,从刘汝佳白书看起,一道简单的枚举题。


网上找不到答案找不到代码,故无法验证程序的正确性,思路是正确的:

以每道题描述作为一个条件,枚举每一个答案,再判断是否符合全部十个条件, 符合则输出。


1、第一个答案是b的问题是哪一个? 

  (a)2;(b) 3;(c)4;(d)5;(e)6 

 2、唯一的连续两个具有相同答案的问题是: 

  (a)2,3;(b)3,4;(c)4,5;(d)5,6;(e)6,7; 

 3、本问题答案和哪一个问题的答案相同? 

  (a)1;(b)2;(c)4;(d)7;(e)6 

 4、答案是a的问题的个数是: 

  (a)0;(b)1;(c)2;(d)3;(e)4 

 5、本问题答案和哪一个问题的答案相同? 

  (a)10;(b)9;(c)8;(d)7;(e)6 

 6、答案是a的问题的个数和答案是什么的问题的个数相同? 

  (a)b;(b)c;(c)d;(d)e;(e)以上都不是 

 7、按照字母顺序,本问题的答案和下一个问题的答案相差几个字母? 

  (a)4;(b)3;(c)2;(d)1;(e)0。(注:a和b相差一个字母) 

 8、答案是元音字母的问题的个数是: 

  (a)2;(b)3;(c)4;(d)5;(e)6。(注:a和e是元音字母) 

 9、答案是辅音字母的问题的个数是: 

  (a)一个质数;(b)一个阶乘数;(c)一个平方数;(d)一个立方数,(e)5的倍数 

 10、本问题的答案是: 

  (a)a;(b)b;(c)c;(d)d;(e)e。


代码如下:

#include<iostream>
using namespace std;

int answer[11];

bool t1(int),t2(int),t3(int),t4(int),t5(int),t6(int),t7(int),t8(int),t9(int),t10(int);

char tochar(int a){
	return a+'a';
}
void print(){
	for(int i=1;i<=10;i++)
		cout<<tochar(answer[i]);
	cout<<endl;
}

bool t1(int a){
	bool flag=true;
	for(int i=0;i<a;i++){
		if(1==answer[a-i])
			flag=false;
	}
	return ((1==answer[a+2])&&flag);
}
bool t2(int a){
	return (answer[a+2]==answer[a+3]);
}
bool t3(int a){
	if(a==0 && (answer[3]==answer[1]))
		return true;
	if(a==1 && (answer[3]==answer[2]))
		return true;
	if(a==2 && (answer[3]==answer[4]))
		return true;
	if(a==3 && (answer[3]==answer[7]))
		return true;
	if(a==4 && (answer[3]==answer[6]))
		return true;
	return false;
}
bool t4(int a){
	int k=0;
	for(int i=1;i<=10;i++)
		if(0==answer[i])
			k++;
	return (k==a);
}
bool t5(int a){
	return (answer[5]==answer[10-a]);
}
bool t6(int a){
	int k[6]={0};
	for(int i=1;i<=10;i++)
		k[answer[i]]++;
	k[5]=k[0];
	
	return (k[0]==k[a+1]);
}
bool t7(int a){
	return ((answer[8]-answer[7])==(4-a));
}
bool t8(int a){
	int k[5]={0};
	for(int i=1;i<=10;i++)
		k[answer[i]]++;
	return ((k[0]+k[4])==(a+2));

}
bool t9(int a){
	int k[5]={0},s=0;
	for(int i=1;i<=10;i++)
		k[answer[i]]++;
	s=k[1]+k[2]+k[3];
	if(a==0 && (s==2||s==3||s==5||s==7))
		return true;
	if(a==1 && (s==1||s==2||s==6))
		return true;
	if(a==2 && (s==1||s==3||s==9))
		return true;
	if(a==3 && (s==1||s==8))
		return true;
	if(a==4 && (s==5||s==10))
		return true;
}
bool t10(int a){
	return (a==answer[10]);
}

int main(){
	for(int i1=0;i1<5;i1++)
	for(int i2=0;i2<5;i2++)
	for(int i3=0;i3<5;i3++)
	for(int i4=0;i4<5;i4++)
	for(int i5=0;i5<5;i5++)
	for(int i6=0;i6<5;i6++)
	for(int i7=0;i7<5;i7++)
	for(int i8=0;i8<5;i8++)
	for(int i9=0;i9<5;i9++)
	for(int i10=0;i10<5;i10++){
		int k=0;
		answer[++k]=i1;answer[++k]=i2;answer[++k]=i3;answer[++k]=i4;answer[++k]=i5;
		answer[++k]=i6;answer[++k]=i7;answer[++k]=i8;answer[++k]=i9;answer[++k]=i10;
		if(t1(i1)&&t2(i2)&&t3(i3)&&t4(i4)&&t5(i5)&&t6(i6)&&t7(i7)&&t8(i8)&&t9(i9)&&t10(i10))
			print();
	}
	cout<<"DNF"<<endl;
	return 0;
	
}

注:

0、answer从1~10十个数字用来表示十道题,0~4共五个数字分别代表a~e。

1、bool tx(int a)代表答案a是否符合第x道题的描述。有几道题return部分做了简化,还是能看懂的不过。

2、有很多地方可以改进以提高程序速度,但这里还是以思路为主,不管他了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值