IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> POJ-1684 Dynamic Declaration Language (DDL) (大模拟) -> 正文阅读

[C++知识库]POJ-1684 Dynamic Declaration Language (DDL) (大模拟)

题目链接:

Dynamic Declaration Language (DDL) - POJ 1684 - Virtual Judge

题目大意:

给n组指令,指令有以下几种。

DCL X 表示定义一个名为X的变量,并且初值为0

INC X 变量名为X的值+1

DEC X 变量名为X的值-1

GOTO X label 如果变量X的值大于0,则跳转到第label行,反之,跳过这条指令到下一行(我就是这段读错题意了,我以为是跳到label的下一行)

GOTO label 跳转到label行

END 结束操作

X = value 将value赋值给变量X

如果定义(DCL X)了一个变量之后,没有对他进行操作(指没有INC或DEC或GOTO X或赋值)就再次定义(DCL X)则报指令为1的错误。输出为i 1(即第i行出现1错误)。

如果未定义变量,就对这个变量进行操作,则报指令为2的错误。输出为i 2(第i行出现2错误)。

以上报错行的命令均无效。

且此题有多组数据,输出答案前需要输出这是第几组数据(我不知道是我读题有问题还是怎么样,我根本没有在题目中看到这个意思,还是根据输出猜出来的)

解题思路:

其实这题不难,是一个很直白的模拟题,但是有挺多细节需要注意。

我的思路是,首先将所有命令读进来,用结构体存储。结构体的op表示这是第一个命令,t表示这个变量名是什么,val表示如果值读入(比如赋值语句和GOTO语句),则是这个值。t的初值是‘-’,其他初值是0.

开两个map<char,int>f, value,第一个用于处理DCL语句,如果x没有定义,则f[x] = 0;定义了,f[x] = 1;如果这个变量的值被处理过了,则f[x] = 2.value[x]表示x的值。

然后就按照题意进行操作就好。

这题思路不难。为数不多的难点在于正确理解题意,字符串的读入,细节处理。

不过这几点也同样是这种没有什么需要贪心思路的模拟题的注意点。

我的代码逻辑还算清晰,具体细节就不讲了,直接上代码。

代码实现:

#include <iostream>
#include <map>
using namespace std;
const int N = 2e4 + 107;
struct node {
    int op;
    char t;
    int val;
}a[N];
map<char, int> f, value;
int main () {
    ios::sync_with_stdio(0);
    cin.tie(0);
    int T;
    cin >> T;
    for (int cas = 1; cas <= T; cas++) {
        cout << cas << endl;
        f.clear();
        value.clear();
        int n;
        cin >> n;
        string s;
        for (int i = 1; i <= n; i++) {
            a[i].op = 0;
            a[i].t = '-';
            a[i].val = 0;
            cin >> s;
            if (s == "DCL") {
                a[i].op = 1;
                cin >> s;
                a[i].t = s[0];

            } else if (s == "INC") {
                a[i].op = 2;
                cin >> s;
                a[i].t = s[0];
            } else if (s == "DEC") {
                a[i].op = 3;
                cin >> s;
                a[i].t = s[0];
            } else if(s == "GOTO") {
                a[i].op = 4;
                cin >> s;
                if (isdigit(s[0])) {
                    for (int j = 0; j < s.size(); j++) {
                        a[i].val = a[i].val * 10 + (s[j] - '0');
                    }
                } else {
                    a[i].t = s[0];
                    cin >> s;
                    for (int j = 0; j < s.size(); j++) {
                        a[i].val = a[i].val * 10 + (s[j] - '0');
                    }
                }
            } else if (s == "END") {
                a[i].op = 5;
            } else {
                a[i].op = 6;
                a[i].t = s[0];
                cin >> s;
                if (s != "=") continue;
                cin >> s;
                for (int j = 0; j < s.size(); j++) {
                    a[i].val = a[i].val * 10 + (s[j] - '0');
                }
            }
        }
        int i = 1;
        while (i <= n) {
            if (a[i].op == 1) {//DCL f[t] = 0 DCL没操作 1 2已经操作
                if (f[a[i].t] == 1) {
                    cout << i << " 1\n";
                } else {
                    f[a[i].t] = 1;
                    value[a[i].t] = 0;
                }
                i++;
            } else if (a[i].op == 2) {//INC
                if (f[a[i].t] == 0) {
                    cout << i << " 2\n";
                } else {
                    f[a[i].t] = 2;
                    value[a[i].t]++;
                }
                i++;
            } else if (a[i].op == 3) {//DEC
                if (f[a[i].t] == 0) {
                    cout << i << " 2\n";
                } else {
                    f[a[i].t] = 2;
                    value[a[i].t]--;
                }
                i++;
            } else if (a[i].op == 4) {//goto
                if (a[i].t != '-') {
                    if (f[a[i].t] == 0) {
                        cout << i << " 2\n";
                        i++;
                    } else {
                        if (value[a[i].t] > 0) {
                            i = a[i].val;
                        } else {
                            i++;
                        }
                    }
                } else {
                    i = a[i].val;
                }
            } else if (a[i].op == 5) {
                break;
            } else if (a[i].op == 6) {
                if (f[a[i].t] == 0) {
                    cout << i << " 2\n";
                } else {
                    f[a[i].t] = 2;
                    value[a[i].t] = a[i].val;
                }
                i++;
            }
        }
    }
    return 0;
}

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-02-28 15:10:05  更:2022-02-28 15:12:53 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 8:02:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码