各位大佬帮忙看一下,在线等2
查看原帖
各位大佬帮忙看一下,在线等2
1411725
hushuoyan楼主2024/8/30 20:38

能不能帮帮我,会关注的☹

#include <bits/stdc++.h>
using namespace std;

int n,k,len,s,y;
vector<int> xli; //x的可能情况
stack<int> st; //括号栈
set<int> ans; //y的可能情况
char a[1010][1010]; //存储程序

struct node{
    bool tp; //0是赋值,1是判断
    char op; //记录判断符号
    int va; //记录比较值
    int ed; //匹配的右括号行数
}p[1010];

int fun(int x){ //计算当x的值为x,y的值
    y = 0;
    for (int i = 1;i <= n;i++){
        if (p[i].tp){
            if (p[i].op == '<') if (x >= p[i].va) i = p[i].ed; //不符合直接跳
            if (p[i].op == '>') if (x <= p[i].va) i = p[i].ed; //不符合直接跳
        }else y = p[i].va; //赋值
    }
    return y;
}

int main(){
    scanf("%d\n",&n);
    for (int i = 1;i <= n;i++){
        cin >> a[i];
        len = strlen(a[i]);
        p[i].tp = 0;
        p[i].op = '?';
        s = 0;
        for (int j = 0;j < len;j++){
            if (a[i][j] == '<') p[i].op = '<';
            if (a[i][j] == '>') p[i].op = '>'; //记录符号
            if (a[i][j] == '}'){ //判断右括号
                p[i].tp = 1;
                int topp = st.top();
                st.pop();
                p[topp].ed = i; //记录所在行数
                break;
            }
            if (j > 0 && a[i][j - 1] == 'i' && a[i][j] == 'f'){ //判断左括号
                p[i].tp = 1;
                st.push(i);
            }
            if (isdigit(a[i][j])) s = s * 10 + a[i][j] - 48; //计算数字
        }  
        p[i].va = s; //存储数字
		if (p[i].tp){
			if (p[i].op == '<') xli.push_back(s - 1);
			else xli.push_back(s + 1);
		} //存储x的可能值
    }
    for (int i = 0;i < xli.size();i++) ans.insert(fun(xli[i])); //计算y的值
    set<int>::iterator it;
	for (it = ans.begin();it != ans.end();it++) cout << *it <<' '; //输出
    return 0;
}
2024/8/30 20:38
加载中...