问题描述
某场比赛过后,你想要知道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;
}