算法提高 判断名次

问题描述
  某场比赛过后,你想要知道A~E五个人的排名是什么,于是要求他们每个人说了一句话。(经典的开头……-_-!)得了第1名的人23,说了假话;得了第5名的人不好意思,也说了假话;为了使求解问题简单,第3名同样说了假话。(奇数名次说假话)
输入格式
  共5行,各行依次表示A~E说的话。
  每行包含一个形如“A>=3”的名次判断,即一个大写字母+关系运算符+一个数字,不包含空格。
  大写字母A~E,关系运算<、<=、=、>=、>、!=,数字1~5。注意:等于是“=”不是“==”!
输出格式
  可能有多解,请按照字典序输出排名序列,每个解一行
  最后一行输出解的数量
样例输入
A=2
D=5
E>3
A>2
B!=1
样例输出
ACDEB
AECBD
BADCE
BCADE
BDACE
CEADB
CEBDA
7

#include
#include
using namespace std;
bool jiahua[10];    //代表相应名次的人说真/假话,true代表真话。 
char mingci[10];    //名次序列 
string ist[10];     //指令序列 

bool judge(){
    string strist;
    char pep,ope,ope2;int mc;//分别代表人,操作,名次。
    char iequal='!'; 
    char equal='=';
    char big='>';
    //增加部分。 
    char smal='<'; 
    for(int i=1;i<=5;i++){

        int istidx=mingci[i]-'A'+1;
        strist=ist[istidx]; //取出指令
        ope=strist[1];      //光系运算符 >,<,=,! 
        ope2=strist[2];     //运算符第二位 = 
        pep=strist[0];
        mc=strist[2]-'0';   //分情况 

        if(jiahua[i]){  //说真话。 
         if(ope==equal){    
            if(pep!=mingci[mc])return false;
         }else if(ope==iequal){
            mc=strist[3]-'0';
            if(pep==mingci[mc])return false;
         }else if(ope==big&&ope2!=equal){   //表示'>'这种情况 
            for(int j=0;j<=mc;j++){
                if(mingci[j]==pep)return false;
            } 
        }else if(ope==big&&ope2==equal){    //表示">="这种情况 
            mc=strist[3]-'0';
            for(int j=0;jif(mingci[j]==pep)return false;
            }
        }
        else if(ope==smal&&ope2!=equal){    //表示"<"这种情况 
            for(int j=mc;j<=5;j++){
                if(mingci[j]==pep)return false;
            } 
        } 
        else if(ope==smal&&ope2==equal){    //表示"<="这种情况 
            mc=strist[3]-'0';
            for(int j=mc+1;j<=5;j++){
                if(mingci[j]==pep)return false;
            }
        } 
      }else{
        if(ope==equal){
            if(pep==mingci[mc])return  false;
          }else if(ope==iequal){
            mc=strist[3]-'0';
            if(pep!=mingci[mc])return false;
          }else if(ope==big&&ope2!=equal){//表示'>'这种情况 
            for(int j=mc+1;j<=5;j++){
                if(mingci[j]==pep)return false;
              }
          }else if(ope==big&&ope2==equal){  //表示">="这种情况 
            mc=strist[3]-'0';
            for(int j=mc;j<=5;j++){
                if(mingci[j]==pep)return false;
            }
        }
        else if(ope==smal&&ope2!=equal){    //表示"<"这种情况 
            for(int j=0;jif(mingci[j]==pep)return false;
            } 
        } 
        else if(ope==smal&&ope2==equal){    //表示"<="这种情况 
            mc=strist[3]-'0';
            for(int j=0;j<=mc;j++){
                if(mingci[j]==pep)return false;
            }
        }
      }

    }   return true;
}

int main(){
//  freopen("input.txt","r",stdin);
//  freopen("output.txt","w",stdout);
    int i,j,ans=0;
    jiahua[2]=true;
    jiahua[4]=true;
    for(i=1;i<=5;i++){
        cin>>ist[i];
    }
    for(i=1;i<=5;i++){
        mingci[i]='A'+i-1;
    }

    do{
        if(judge()){
            for(j=1;j<=5;j++)
            cout<cout<while(next_permutation(mingci+1,mingci+6));
    cout<return 0;
} 

你可能感兴趣的:(蓝桥杯)