大一暑假,从今开始踏入算法路,从刘汝佳白书看起,一道简单的枚举题。
网上找不到答案找不到代码,故无法验证程序的正确性,思路是正确的:
以每道题描述作为一个条件,枚举每一个答案,再判断是否符合全部十个条件, 符合则输出。
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、有很多地方可以改进以提高程序速度,但这里还是以思路为主,不管他了。