----------------解决方案--------------------------------------------------------
有了20楼的回答,结果很容易就出来了:
The answer is:
c d e b e e d c b a
程序有点长,贴上来讨论一下:
#include <stdio.h>
#define M 10 /*题目个数*/
#define N 5 /*选项个数*/
int answer[11]={0,1,1,1,1,1,1,1,1,1,1};
/*每次增1,相当于一种答案*/
void increase(void)
{
int i;
answer[M]++;
for(i=M;i>=0;i--)
{
if(answer[i]==(N+1))
{
answer[i]=1;
answer[i-1]+=1;
}
}
}
/*1、第一个答案是b的问题是哪一个?
(a)2;(b) 3;(c)4;(d)5;(e)6*/
int Judge_1(void)
{
int i,r=1;
for(i=1;i<=M;i++)
{
if(answer[i]==2)
break;
}
switch(i) /*此时i为第一个答案为b的题目号*/
{
case 1: r=0;break;
case 2: if(answer[1]!=1) r=0;break;
case 3: if(answer[1]!=2) r=0;break;
case 4: if(answer[1]!=3) r=0;break;
case 5: if(answer[1]!=4) r=0;break;
case 6: if(answer[1]!=5) r=0;break;
default: r=0;break;
}
return r;
}
/*2、唯一的连续两个具有相同答案的问题是:
(a)2,3;(b)3,4;(c)4,5;(d)5,6;(e)6,7;*/
int Judge_2(void)
{
int i,r=0;
int start,size=1,number=0;
for(i=2;i<=M;i++)
{
if(answer[i-1]==answer[i])
{
size++;
start=i-1;
}
else
{
if(size==2)
{
number++;
size=1;
}
}
}
if(number==1)
switch(start)
{
case 2: if(answer[2]==1) r=1;break;
case 3: if(answer[2]==2) r=1;break;
case 4: if(answer[2]==3) r=1;break;
case 5: if(answer[2]==4) r=1;break;
case 6: if(answer[2]==5) r=1;break;
}
return r;
}
/*3、本问题答案和哪一个问题的答案相同?
(a)1;(b)2;(c)4;(d)7;(e)6*/
int Judge_3(void)
{
int r=0;
if( (answer[3]==answer[1]) && (answer[3]==1) ) r=1;
else if( (answer[3]==answer[2]) && (answer[3]==2) ) r=1;
else if( (answer[3]==answer[4]) && (answer[3]==3) ) r=1;
else if( (answer[3]==answer[7]) && (answer[3]==4) ) r=1;
else if( (answer[3]==answer[6]) && (answer[3]==5) ) r=1;
return r;
}
/*4、答案是a的问题的个数是:
(a)0;(b)1;(c)2;(d)3;(e)4*/
int Judge_4(void)
{
int i,r=1,n=0;
for(i=1;i<=M;i++)
{
if(answer[i]==1)
n++;
}
switch(n) /*此处n为答案为a的题目的个数*/
{
case 0: if(answer[4]!=1) r=0;break;
case 1: if(answer[4]!=2) r=0;break;
case 2: if(answer[4]!=3) r=0;break;
case 3: if(answer[4]!=4) r=0;break;
case 4: if(answer[4]!=5) r=0;break;
default: r=0;break;
}
return r;
}
/*5、本问题答案和哪一个问题的答案相同?
(a)10;(b)9;(c)8;(d)7;(e)6*/
int Judge_5(void)
{
int r=0;
if( (answer[3]==answer[10]) && (answer[3]==1) ) r=1;
else if( (answer[3]==answer[9]) && (answer[3]==2) ) r=1;
else if( (answer[3]==answer[8]) && (answer[3]==3) ) r=1;
else if( (answer[3]==answer[7]) && (answer[3]==4) ) r=1;
else if( (answer[3]==answer[6]) && (answer[3]==5) ) r=1;
return r;
}
/*6、答案是a的问题的个数和答案是什么的问题的个数相同?
(a)b;(b)c;(c)d;(d)e;(e)以上都不是*/
int Judge_6(void)
{
int i,r=1;
int a=0,b=0,c=0,d=0,e=0;
for(i=1;i<=M;i++)
{
switch(answer[i])
{
case 1: a++;break;
case 2: b++;break;
case 3: c++;break;
case 4: d++;break;
case 5: e++;break;
default:break;
}
}
if(a==b && answer[6]!=1) r=0;
else if(a==c && answer[6]!=2) r=0;
else if(a==d && answer[6]!=3) r=0;
else if(a==e && answer[6]!=4) r=0;
else if(answer[6]!=5) r=0;
return r;
}
/*7、按照字母顺序,本问题的答案和下一个问题的答案相差几个字母?
(a)4;(b)3;(c)2;(d)1;(e)0。(注:a和b相差一个字母)*/
int Judge_7(void)
{
int i,r=1,minus;
if(answer[7]>answer[8])
minus=answer[7]-answer[8];
else
minus=answer[8]-answer[7];
switch(minus)
{
case 4: if(answer[7]!=1) r=0;break;
case 3: if(answer[7]!=2) r=0;break;
case 2: if(answer[7]!=3) r=0;break;
case 1: if(answer[7]!=4) r=0;break;
case 0: if(answer[7]!=5) r=0;break;
default: r=0;break;
}
return r;
}
/*8、答案是元音字母的问题的个数是:
(a)2;(b)3;(c)4;(d)5;(e)6。(注:a和e是元音字母)*/
int Judge_8(void)
{
int i,r=1;
int a=0,e=0,n;
for(i=1;i<=M;i++)
{
if(answer[i]==1)
a++;
else if(answer[i]==5)
e++;
}
n=a+e;
switch(n)
{
case 2: if(answer[8]!=1) r=0;break;
case 3: if(answer[8]!=2) r=0;break;
case 4: if(answer[8]!=3) r=0;break;
case 5: if(answer[8]!=4) r=0;break;
case 6: if(answer[8]!=5) r=0;break;
default: r=0;break;
}
return r;
}
/*9、答案是辅音字母的问题的个数是:
(a)一个质数;(b)一个阶乘数;(c)一个平方数;(d)一个立方数,(e)5的倍数*/
int Judge_9(void)
{
int i,r=1;
int a=0,e=0,n;
for(i=1;i<=M;i++)
{
if(answer[i]==1)
a++;
else if(answer[i]==5)
e++;
}
n=10-a-e;
switch(n)
{
case 3:
case 7: if(answer[9]!=1) r=0;break;
case 6: if(answer[9]!=2) r=0;break;
case 4:
case 9: if(answer[9]!=3) r=0;break;
case 8: if(answer[9]!=4) r=0;break;
case 10:if(answer[9]!=5) r=0;break;
default: r=0;break;
}
return r;
}
/*10、本问题的答案是:
(a)a;(b)b;(c)c;(d)d;(e)e。*/
int Judge_10(void)
{
int r=1;
switch(answer[10])
{
case 1: if(answer[10]!=1) r=0;break;
case 2: if(answer[10]!=2) r=0;break;
case 3: if(answer[10]!=3) r=0;break;
case 4: if(answer[10]!=4) r=0;break;
case 5: if(answer[10]!=5) r=0;break;
default: r=0;break;
}
return r;
}
/*排除无用的答案,发现有错误答案返回0*/
int Judge(void)
{
int r=1;
r&=Judge_1();
r&=Judge_2();
r&=Judge_3();
r&=Judge_4();
r&=Judge_5();
r&=Judge_6();
r&=Judge_7();
r&=Judge_8();
r&=Judge_9();
r&=Judge_10();
return r;
}
int main()
{
int i,judge;
while(answer[0]!=1)
{
judge=Judge();
if(judge==0)
{
increase();
continue;
}
printf("The answer is:\n");
for(i=1;i<=M;i++)
{
printf("%7c",'a'+answer[i]-1);
}
putchar('\n');
/*getch();*/
increase();
}
}
[此贴子已经被作者于2007-4-8 22:04:23编辑过]
----------------解决方案--------------------------------------------------------
程序中第10个条件的判断可以不用,可以省下一部分时间
----------------解决方案--------------------------------------------------------
楼上的大哥留个QQ吧,我实在是太佩服你了。
----------------解决方案--------------------------------------------------------
楼上的楼上做的不错
----------------解决方案--------------------------------------------------------
正解
----------------解决方案--------------------------------------------------------
楼上的大哥留个QQ吧,我实在是太佩服你了。
呵呵,我也是在学习中,这个程序写了快1天了
准备改天用指针再写一次,应该可以提高效率
我的QQ:89482302,欢迎一起讨论C语言!
[此贴子已经被作者于2007-4-8 22:37:22编辑过]
----------------解决方案--------------------------------------------------------
效率再高,没人的高
----------------解决方案--------------------------------------------------------
我的QQ是:64430968。我谈不上讨论,我直能是请教。
----------------解决方案--------------------------------------------------------
我觉得判断应该可以做的在好点.
不过我觉得你的穷举答案的那个部分写的很好.
我差点就要写成10层for了
----------------解决方案--------------------------------------------------------