算法提高 判断名次

本文介绍了一个用于解决特定排名推理问题的算法。该算法基于输入的条件判断,通过回溯搜索来找出所有可能的排名组合,并确保符合特定说谎者的规则。文章详细展示了如何解析输入条件并实现有效的验证函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述
  某场比赛过后,你想要知道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<iostream>
#include<algorithm>
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;j<mc;j++){
                if(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;j<mc;j++){
                if(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<<mingci[j];
            cout<<endl;
            ans++;
        }

    }while(next_permutation(mingci+1,mingci+6));
    cout<<ans<<endl;

    return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值