一道推理题:问题的答案

一道推理题如下:
1.第一个答案是A的问题是哪一个?( )
A、1 B、2 C、3 D、4
2.唯一的连续两个具有相同答案的问题是( )
A、5,6 B、6,7 C、7,8 D、8,9
3.本问题答案和哪一个问题的答案相同( )
A、4 B、9 C、8 D、2
4.答案是A的问题的个数是( )
A、5 B、4 C、3 D、2
5.本问题答案和哪一个问题的答案相同( )
A、1 B、2 C、3 D、4
6.答案选A的问题的个数和答案选什么的问题的个数相同( )
A、无 B、C C、C D、D
7.按照字母顺序,本题答案与下一题相差( )(A与B间,或B与A间均相差1)
A、3 B、2 C、1 D、0
8.本题中答案为元音的题数为( )
A、0 B、1 C、2 D、3
9.本题中答案为辅音的题数( )
A、是合数 B、是质数 C、<5 D、是平方数
10.本题答案为( )
A、A B、B C、C D、D

答案是:A,C,B,C,A,C,D,D,B,A
一共10道题,每个题的答案有A,B,C,D四种可能性,因此可能的解有4^10种可能性,根据题目遍历答案,找到合适的答案即返回。

#include 
#include 
class Question{
public:
    void InitAnsList();//对答案进行初始化
    void FindAnsList();//穷举每一个可能的答案,找到正确答案后返回
    void PrintAnsList();//打印答案
private:
    char answer[10];//存储答案的变量
    bool CheckAnswer01();
    bool CheckAnswer02();
    bool CheckAnswer03();
    bool CheckAnswer04();
    bool CheckAnswer05();
    bool CheckAnswer06();
    bool CheckAnswer07();
    bool CheckAnswer08();
    bool CheckAnswer09();
    bool CheckAnswer10(); //10个题目,10个校验条件
    bool UpdateAnswer(); //更新答案

};

void Question::InitAnsList()
{
    for(int loop = 0;loop < 10;loop++)
    {
        answer[loop] = 'A';
    }
    answer[9] = 'A' - 1;
}

void Question::FindAnsList()
{
    while(UpdateAnswer())
    {
        if(!CheckAnswer01()) continue;
        if(!CheckAnswer02()) continue;
        if(!CheckAnswer03()) continue;
        if(!CheckAnswer04()) continue;
        if(!CheckAnswer05()) continue;
        if(!CheckAnswer06()) continue;
        if(!CheckAnswer07()) continue;
        if(!CheckAnswer08()) continue;
        if(!CheckAnswer09()) continue;
        PrintAnsList();
        cout<<endl;
        break;
    };
}

void Question::PrintAnsList()
{
    for(unsigned int loop = 0;loop < 10;loop++)
    {
        cout<<answer[loop]<<',';
    }
}
bool Question::UpdateAnswer()
{
    answer[9] += 1;
    for(unsigned char loop = 9;loop >= 1;loop--)
    {
        if(answer[loop] > 'D')
        {
            answer[loop] = 'A';
            answer[loop - 1] += 1;
        }
    }
    if(answer[0] > 'D') return false;
    return true;
}

bool Question::CheckAnswer01()
{
    if(answer[0] > 'D') return false;
    unsigned char index = answer[0] - 'A';
    for(unsigned char loop = 0;loop < index; loop++)
    {
        if(answer[loop] == 'A') return false;
    }
    if(answer[index] != 'A') return false;
    return true;
}
bool Question::CheckAnswer02()
{
    if(answer[1] > 'D') return false;
    unsigned char index = answer[1] - 'A' + 4;
    if(answer[index] != answer[index + 1]) return false;
    for(unsigned char loop = 0;loop < index; loop++)
    {
        if(answer[loop] == answer[loop + 1]) return false;
    }
    for(unsigned char loop = index + 1;loop < 9; loop++)
    {
        if(answer[loop] == answer[loop + 1]) return false;
    }
    return true;

}
bool Question::CheckAnswer03()
{
    unsigned char index = 0;
    if(answer[2] > 'D') return false;
    switch(answer[2])
    {
        case 'A' :
            index = 3;
            break;
        case 'B' :
            index = 8;
            break;
        case 'C' :
            index = 7;
            break;
        default :
            index = 1;
            break;
    }
    if(answer[2] != answer[index]) return false;
    return true;
}
bool Question::CheckAnswer04()
{
    if(answer[3] > 'D') return false;
    unsigned char index = 'F' - answer[3];
    unsigned char count = 0;
    for(int loop = 0;loop < 10;loop++)
    {
        if(answer[loop] == 'A') count++;
    }
    return count == index;
}
bool Question::CheckAnswer05()
{
    if(answer[4] > 'D') return false;
    unsigned char index = answer[4] - 'A';
    return answer[4] == answer[index];
}
bool Question::CheckAnswer06()
{
    if(answer[5] > 'D') return false;
    int aCnt = 0,bCnt = 0, cCnt = 0,dCnt = 0;
    for(int loop = 0;loop < 10;loop++)
    {
        if(answer[loop] == 'A') aCnt++;
        if(answer[loop] == 'C') cCnt++;
        if(answer[loop] == 'D') dCnt++;
        if(answer[loop] == 'B') bCnt++;
    }
    if((aCnt == cCnt) && ((answer[5] == 'B') || (answer[5] == 'C'))) return true;
    if((aCnt == dCnt) && (answer[5] == 'D')) return true;
    if((aCnt != bCnt) && (aCnt != cCnt) && (aCnt != dCnt) && (answer[5] == 'A')) return true;
    return false;
}
bool Question::CheckAnswer07()
{
    if(answer[6] > 'D') return false;
    unsigned char index = 'D' - answer[6];
    return abs(answer[7] - answer[6]) ==  index;

}
bool Question::CheckAnswer08()
{
    if(answer[7] > 'D') return false;
    unsigned char index = answer[7] - 'A';
    unsigned char count = 0;
    for(unsigned char loop = 0;loop < 10;loop++)
    {
        if(answer[loop] == 'A') count++;
    }
    return count == index;
}
bool Question::CheckAnswer09()
{
    if(answer[8] > 'D') return false;
    unsigned char count = 0;
    for(unsigned char loop = 0;loop < 10;loop++)
    {
        if(answer[loop] != 'A') count++;
    }
    if((count==4||count==6||count==8||count==9||count==10) && (answer[8]=='A')) return true;
    if((count==2||count==3||count==5||count==7) && (answer[8]=='B')) return true;
    if((count < 5) && (answer[8] == 'C')) return true;
    if((count == 9||count == 0||count == 1) && (answer[8] == 'D'))return true;
    return false;
}
bool Question::CheckAnswer10()
{
    if(answer[9] > 'D') return false;
    return true;
}
int main()
{
    Question a;
    a.InitAnsList();
    a.FindAnsList();
}

你可能感兴趣的:(算法竞赛)