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

字符串处理。

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

考场源码,比较粗糙。

// 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. Nginx下HTTP强制重定向至HTTPS

    Nginx下HTTP强制重定向至HTTPS 对于nginx来说,配置http强制重定向至https有多种多样的写法.可以直接rewrite,也可以用301重定向.但是直接拷贝网上的配置往往会出现问题, ...

  2. ansible on aws linux 2

    1. 安装epel yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm 2. 安 ...

  3. 【2018寒假集训 Day2】【动态规划】又上锁妖塔

    又上锁妖塔 (tower.in/tower.out) [题目描述] 小D在X星买完了想要的东西,在飞往下一个目的地的途中,正无聊的他转头看了看身边的小A,发现小A正在玩<仙剑>,可是小A很 ...

  4. Python-Re正则表达式库

    来源:中国MOOC北京理工大学Python教学团队 链接:https://www.icourse163.org/learn/BIT-1001870001#/learn/content?type=det ...

  5. HashMap面试题,看这一篇就够了!

    目录 序言 一.JDK7中的HashMap底层实现 1.1 基础知识 1.2 put()方法 1.2.1 特殊key值处理 1.2.2 扩容 1.2.3 如何计算bucket下标? 1.2.4 在目标 ...

  6. 【软件工具】easyExcel简明使用指南

    easyExcel简介 Java领域解析.生成Excel比较有名的框架有Apache poi.jxl等.但他们都存在一个严重的问题就是非常的耗内存.如果你的系统并发量不发的话可能还行,但是一旦并发上来 ...

  7. SimpleXML使用详解

    SimpleXML使用详解 介绍 SimpleXML提供了一种简单,直观的方法来处理XML.它只有一个单一类型的类,三个函数和六个方法. 使用SimpleXML SimpleXMLElement 类是 ...

  8. swiper实现一个好看的轮播图

    轮播是我们在编写页面中经常遇到的模块,所以网上也会有各种有有关轮播图的插件.今天忽然间看到了swiper上一个高颜值的轮播功能,顺便做一下分享. 首先页面在head内要先引用 swiper的css 和 ...

  9. 【w、vmstat、top、sar、nload】各个命令 使用介绍

    第7周第1次课(5月7日) 课程内容: 10.1 使用w查看系统负载10.2 vmstat命令10.3 top命令10.4 sar命令10.5 nload命令 10.1 使用w查看系统负载 w命令查看 ...

  10. JPA配置实体时 insertable = false, updatable = false

    当使用JPA配置实体时,如果有两个属性(一个是一般属性,一个是多对一的属性)映射到数据库的同一列,就会报错. 这时,在多对一的@JoinColumn注解中添加insertable = false, u ...