题意: 题目给出一组由小于号和小于等于号组成的表达式,表达式中可能有变量和数字。然后再给出几组对应的变量值,判断每一组给出的变量值是否符合表示式。
思路: 试想一下如果我们知道了所有变量的值,将其存下来,然后只需要对每个式子从左到右遍历判断一遍就得到结果了。存储数据时我的思路如下(拿样例举个例子):
式子: A < B <= E
num: -1 -1 -1 //用 num 数组来存现有的数字,如果是变量则存入 -1
alph: A B E //用 alph 数组来存入当前的变量是哪个字母
eql: false true false //为 true 表示当前位的数或变量应小于等于下一位的数
代码:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<stack>
#include<queue>
#include<utility>
#include<vector>
#include<cmath>
#include<set>
#include<map>
#include<iostream>
#include<algorithm>
#include<sstream>
using namespace std;
typedef long long LL;
int N, T;
int num[25][1000];
char alph[25][1000];
bool eql[25][1000];
int alphval[30];
char str[1000];
set<char> sset;
void Solve(int row)
{
memset(num[row], 0, sizeof(num[row]));
memset(alph[row], 0, sizeof(alph[row]));
int len = strlen(str);
for(int i=0; i<len; i++){
if(str[i]>='A' && str[i]<='Z'){
num[row][++num[row][0]] = -1;
alph[row][num[row][0]] = str[i];
sset.insert(str[i]);
}
else if(str[i]>='0' && str[i]<='9'){
int sum = 0;
while(i<len && str[i]>='0' && str[i]<='9'){
sum *= 10;
sum += str[i]-'0';
i++;
}
i--;
num[row][++num[row][0]] = sum;
}
else if(str[i] == '<'){
if(str[i+1] == '='){
eql[row][num[row][0]] = true;
i++;
}
else{
eql[row][num[row][0]] = false;
}
}
}
}
bool Judge()
{
for(int i=0; i<N; i++){
int fro;
for(int j=1; j<=num[i][0]; j++){
if(j == 1){
if(num[i][j] == -1){
fro = alphval[alph[i][j]-'A'];
}
else{
fro = num[i][j];
}
}
else{
int beh;
if(num[i][j] == -1){
beh = alphval[alph[i][j]-'A'];
}
else{
beh = num[i][j];
}
if(eql[i][j-1]){
if(fro <= beh){
fro = beh;
}
else{
return false;
}
}
else{
if(fro < beh){
fro = beh;
}
else{
return false;
}
}
}
}
}
return true;
}
int main()
{
//freopen("in.txt", "r", stdin);
while(scanf("%d", &N) == 1){
sset.clear();
for(int i=0; i<N; i++){
scanf("%s", str);
Solve(i);
}
scanf("%d", &T);
getchar();
for(int i=0; i<T; i++){
char ch;
int tmp;
for(int j=0; j<sset.size(); j++){
scanf("%c%d", &ch, &tmp);
getchar();
alphval[ch-'A'] = tmp;
}
if(Judge()){
printf("Yes\n");
}
else{
printf("No\n");
}
}
}
return 0;
}