十道连锁问题的求解

来源:互联网 发布:先锋软件 编辑:程序博客网 时间:2024/06/11 00:18
请回答下面的10个问题:
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)4
6、答案是A的问题的个数和答案是什么的问题的个数相同?
(A)B  (B)C  (C)D  (D)E  (E)以上都不是
7、按照字母顺序,本问题的答案和下一个问题的答案相差几个字母?
(A)4  (B)3  (C)2  (D)1  (E)0
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
请给出算法。
   initquestion();
   makesolution(
-1,Memo1);


int question[N];//问题解向量,初始值应均置为0
int check1()//检查问题1答案是否正确
{
  
int ok=0;
  
int x,i;
  x
=question[0];
  
for(i=0;i<N;i++if(question[i]==2break;
  
if(x+1==i+1) ok=1;
  
return ok  ;
}

int check2()//检查问题2答案是否正确
{
  
int ok=0;
  
int i,f,c;
  c
=0;f=-1;
  
for(i=0;i<N-1;i++)
  
{
    
if(question[i]==question[i+1]){
      
if(f==-1) f=i+1;
      c
++;
    }

  }

  
if(c!=1) ok=0;
  
else{
    
switch(question[1]){
      
case 1:
        
if(f==2) ok=1;
        
break;
      
case 2:
        
if(f==3) ok=1;
        
break;
      
case 3:
        
if(f==4) ok=1;
        
break;
      
case 4:
        
if(f==5) ok=1;
        
break;
      
case 5:
        
if(f==6) ok=1;
        
break;

    }

  }

  
return ok ;

}

int check3()//检查问题3答案是否正确
{
  
int ok=0;
  
int i;
  i
=question[2];
  
switch(i){
    
case 1:
      
if(i==question[0]) ok=1;
      
break;
    
case 2:
      
if(i==question[1]) ok=1;
      
break;
    
case 3:
      
if(i==question[3]) ok=1;
      
break;
    
case 4:
      
if(i==question[6]) ok=1;
      
break;
    
case 5:
      
if(i==question[5]) ok=1;
      
break;
  }

  
return ok ;

}

int check4()//检查问题4答案是否正确
{
  
int ok=0;
  
int c,i;
  c
=0;
  
for(i=0;i<N;i++){
    
if(question[i]==1) c++;
  }

  
if(c==question[3]-1) ok=1;
  
return ok ;

}

int check5()//检查问题5答案是否正确
{
  
int ok=0;
  
int i;
  i
=question[4];
  
switch(i){
    
case 1:
      
if(question[9]==1) ok=1;
      
break;
    
case 2:
      
if(question[8]==2) ok=1;
      
break;
    
case 3:
      
if(question[7]==3) ok=1;
      
break;
    
case 4:
      
if(question[6]==4) ok=1;
      
break;
    
case 5:
      
if(question[5]==5) ok=1;
      
break;

  }

  
return ok;

}

int check6()//检查问题6答案是否正确
{
  
int ok=0;
  
int a,b,c,d,e,i;
  a
=b=c=d=e=0;
  
for(i=0;i<N;i++){
    
switch(question[i]){
      
case 1:a++;break;
      
case 2:b++;break;
      
case 3:c++;break;
      
case 4:d++;break;
      
case 5:e++;break;
    }

  }

  i
=question[5];
  
switch(i){
    
case 1:
      
if(a==b) ok=1;
      
break;
    
case 2:
      
if(a==c) ok=1;
      
break;
    
case 3:
      
if(a==d) ok=1;
      
break;
    
case 4:
      
if(a==e) ok=1;
      
break;
    
case 5:
      
if(a!=&& a!=&& a!=&& a!=e) ok=1;
      
break;
  }

  
return ok ;

}

int check7() //检查问题7答案是否正确
{
  
int ok=0;
  
int i;
  i
=question[6]-question[7];
  
if(i<0) i=i*(-1);
  
switch(question[6]){
    
case 1:
      
if(i==4) ok=1;
      
break;
    
case 2:
      
if(i==3) ok=1;
      
break;
    
case 3:
      
if(i==2) ok=1;
      
break;
    
case 4:
      
if(i==1) ok=1;
      
break;
    
case 5:
      
if(i==0) ok=1;
      
break;

  }

  
return ok;

}

int check8()  //检查问题8答案是否正确
{
  
int ok=0;
  
int i,c;
  c
=0;
  
for(i=0;i<N;i++){
    
if(question[i]==1 || question[i]==5) c++;
  }

  
switch(question[7]){
    
case 1:
      
if(c==2) ok=1;
      
break;
    
case 2:
      
if(c==3) ok=1;
      
break;
    
case 3:
      
if(c==4) ok=1;
      
break;
    
case 4:
      
if(c==5) ok=1;
      
break;
    
case 5:
      
if(c==6) ok=1;
      
break;

  }

  
return ok ;

}

int check9()  //检查问题9答案是否正确
{
  
int ok=0;
  
int i,c;
  c
=0;
  
for(i=0;i<N;i++){
    
if(question[i]>=2 && question[i]<=4) c++;
  }

  
switch(question[8]){
    
case 1:
      
if(c==1||c==3 || c==5 || c==7) ok=1;
      
break;
    
case 2:
      
if(c==1||c==2 || c==6 ) ok=1;
      
break;
    
case 3:
      
if(c==1||c==4 || c==9) ok=1;
      
break;
    
case 4:
      
if(c==1||c==8) ok=1;
      
break;
    
case 5:
      
if(c==5 || c==10) ok=1;
      
break;

  }

  
return ok;

}

int check10()  //检查问题10答案是否正确
{
  
return 1;
}


int issolution(void)     //依次检查每个问题答案是否正确
{
  
int ok=0;
  
if(!check1()) goto pend;
  
if(!check2()) goto pend;
  
if(!check3()) goto pend;
  
if(!check4()) goto pend;
  
if(!check5()) goto pend;
  
if(!check6()) goto pend;
  
if(!check7()) goto pend;
  
if(!check8()) goto pend;
  
if(!check9()) goto pend;
  
if(!check10()) goto pend;
  ok
=1;
  pend:
  
return ok;
}

void initquestion(void//初始化解向量
{
  
int i;
  
for(i=0;i<N;i++) question[i]=0;
}

void printsolution(TMemo *m) //显示解向量
{
  
int i;
  String t,t1;
  
char buf[2];
  buf[
1]=0;
  
if(m==NULL) return;
  t
="";
  
for(i=0;i<N;i++){
     t
=t+"("+IntToStr(i+1)+")";
     buf[
0]=question[i]+0x40;
     t1
=buf;
     t
=t+t1+"   ";
  }

  m
->Lines->Add(t);
}

void  makesolution(int k,TMemo *m) //问题求解主算法,主要思想是对状态空间树作深度优先检索
{
  
int i,x;
  
static int ttt=0;
  k
++;

  
if(k>=N){
     x
=(question[0]-1)*5+question[1];
     
if(x>ttt){
       progress
->Position=x;ttt=x;
      Application
->ProcessMessages();
     }

     
if(issolution()) printsolution(m);
  }

  
else{
    
for(i=1;i<=5;i++){
      question[k]
=i;
      makesolution(k,m);
    }

  }

}
原创粉丝点击