判断化学方程式是否配平。

字符串处理。

有点编译原理递归下降法的感觉。

考场源码,比较粗糙。

// INFO BEGIN
//
// User = 201911513451(陶杨)
// Group = C/C++
// Problem = 化学方程式
// Language = CPP11
// SubmitTime = 2019-12-15 16:20:32
//
// INFO END #include <cstdio>
#include <cstring> using namespace std; char str[1005]; int nums[27][27]; void elementSingle(int l, int r, int left, int coef, int coef2) {
if (l > r) return;
int e1, e2 = 0;
e1 = str[l] - 'A' + 1; // [1,26]
if (l < r && !(str[l + 1] >= '0' && str[l + 1] <= '9')) e2 = str[l + 1] - 'a' + 1;
int mid = l + 1;
if (e2 != 0) ++mid;
int co = 0;
while (mid <= r) co = co * 10 + str[mid++] - '0';
if (co == 0) co = 1;
nums[e1][e2] += left * coef * coef2 * co;
} void element(int l, int r, int left, int coef, int coef2) {
if (l > r) return;
// printf("%d %d %d ", left, coef, coef2);
// for (int i = l; i <= r; ++i) printf("%c", str[i]); printf("\n");
int mid = l + 1;
for (; mid <= r && !(str[mid] >= 'A' && str[mid] <= 'Z'); ++mid);
if (mid <= r) {
elementSingle(l, mid - 1, left, coef, coef2);
element(mid, r, left, coef, coef2);
} else elementSingle(l, r, left, coef, coef2);
} void formula(int l, int r, int left, int coef, int coef2) {
if (l > r) return;
int lb = -1, rb = -1, lmore = 0;
for (int i = l; i <= r; ++i) {
if (str[i] == '(') {
++lmore;
if (lb == -1) lb = i;
}
if (str[i] == ')') {
--lmore;
if (lmore == 0 && rb == -1) rb = i;
}
if (rb != -1) break;
}
if (rb == -1) element(l, r, left, coef, coef2); else {
int co = 0, mid = rb + 1;
for (; mid <= r && str[mid] >= '0' && str[mid] <= '9'; ++mid) co = co * 10 + str[mid] - '0';
if (co == 0) co = 1;
element(l, lb - 1, left, coef, coef2);
formula(lb + 1, rb - 1, left, coef, coef2 * co);
formula(mid, r, left, coef, coef2);
}
} void exprSingle(int l, int r, int left) {
if (l > r) return;
int coef = 0, mid = l;
for (; mid <= r && str[mid] >= '0' && str[mid] <= '9'; ++mid) coef = coef * 10 + str[mid] - '0';
if (coef == 0) coef = 1;
formula(mid, r, left, coef, 1);
} void expr(int l, int r, int left) {
if (l > r) return;
int mid = l;
for (; mid <= r && str[mid] != '+'; ++mid);
if (mid <= r) {
exprSingle(l, mid - 1, left);
expr(mid + 1, r, left);
} else exprSingle(l, r, left);
} // [l,r]
void equation(int l, int r) {
if (l > r) return;
int mid = l;
for (; str[mid] != '='; ++mid);
expr(l, mid - 1, 1);
expr(mid + 1, r, -1);
} int main() {
int n;
scanf("%d", &n);
for (int _ = 0; _ < n; ++_) {
scanf("%s", str);
memset(nums, 0, sizeof(nums));
equation(0, strlen(str) - 1);
bool flag = true;
for (int i = 1; i <= 26; ++i) {
for (int j = 0; j <= 26; ++j) {
if (nums[i][j] != 0)
flag = false;
}
}
if (flag) printf("Y\n");
else printf("N\n");
}
return 0;
}

CCF-CSP题解 201912-3 化学方程式的更多相关文章

  1. CCF CSP 201703-3 Markdown

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201703-3 Markdown 问题描述 Markdown 是一种很流行的轻量级标记语言(l ...

  2. CCF CSP 201312-3 最大的矩形

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201312-3 最大的矩形 问题描述 在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i( ...

  3. CCF CSP 201609-3 炉石传说

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201609-3 炉石传说 问题描述 <炉石传说:魔兽英雄传>(Hearthston ...

  4. CCF CSP 201403-3 命令行选项

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201403-3 命令行选项 问题描述 请你写一个命令行分析程序,用以分析给定的命令行里包含哪些 ...

  5. CCF CSP 201709-4 通信网络

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201709-4 通信网络 问题描述 某国的军队由N个部门组成,为了提高安全性,部门之间建立了M ...

  6. CCF CSP 201409-3 字符串匹配

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201409-3 字符串匹配 问题描述 给出一个字符串和多行文字,在这些文字中找到字符串出现的那 ...

  7. CCF CSP 201503-3 节日

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201503-3 节日 问题描述 有一类节日的日期并不是固定的,而是以“a月的第b个星期c”的形 ...

  8. CCF CSP 201509-2 日期计算

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201509-2 日期计算 问题描述 给定一个年份y和一个整数d,问这一年的第d天是几月几日? ...

  9. CCF CSP 201604-2 俄罗斯方块

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201604-2 俄罗斯方块 问题描述 俄罗斯方块是俄罗斯人阿列克谢·帕基特诺夫发明的一款休闲游 ...

  10. CCF CSP 201512-2 消除类游戏

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201512-2 消除类游戏 问题描述 消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行 ...

随机推荐

  1. 你必须知道的容器日志 (2) 开源日志管理方案 ELK

    本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章.上一篇<你必须知道的容器日志(1)>中介绍了Docker自带的log ...

  2. 理解Redis的反应堆模式

    1. Redis的网络模型 Redis基于Reactor模式(反应堆模式)开发了自己的网络模型,形成了一个完备的基于IO复用的事件驱动服务器,但是不由得浮现几个问题: 为什么要使用Reactor模式呢 ...

  3. 2019-9-25:渗透测试,基础学习,medusa爆破学习

    Medusa(美杜莎)暴力破解使用 该文章仅供学习,利用方法来自网络文章,仅供参考 一.简介 medusa(美杜莎)是一个速度快,支持大规模并行,模块化,爆破登陆,可以同时对多个主机,用户或是密码执行 ...

  4. cnpm镜像安装

    npm install -g cnpm --registry=https://registry.npm.taobao.org

  5. leetcode105 从前序与中序遍历序列构造二叉树

    如何遍历一棵树 有两种通用的遍历树的策略: 宽度优先搜索(BFS) 我们按照高度顺序一层一层的访问整棵树,高层次的节点将会比低层次的节点先被访问到. 深度优先搜索(DFS) 在这个策略中,我们采用深度 ...

  6. 打算写一个《重学Node.js》系列,希望大家多多支持

    先放上链接吧,项目已经开始2周了:https://github.com/hellozhangran/happy-egg-server 想法 现在是2019年11月24日,还有人要开始学习Node.js ...

  7. 【计算机网络】你真的了解HTTP(HTTPS)协议的这12个知识点吗

    HTTP协议 1. 介绍一下OSI七层参考模型和TCP/IP五层模型 1.1 OSI七层模型 1.2 TCP/IP五层模型 1.3 各层的设备 [各层设备] 1.4 各层对应协议 2. HTTP协议和 ...

  8. Linux服务和systemctl详解

    定义 A Linux service is an application (or set of applications) that runs in the background waiting to ...

  9. altium designer 20.0.8

    altium designer 20.0.8 download : http://dl3.downloadly.ir/Files/Software/Altium_Designer_20.0.8_Bet ...

  10. mysql配置允许外界连接

    1.在mysql的安装目录下找到mysql.ini 找到bind-address=127.0.0.1 ,(有的有,有的没有) 改为 bind-address = 0.0.0.0 2.登录mysql客户 ...