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

字符串处理。

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

考场源码,比较粗糙。

// 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;
}

最新文章

  1. JavaWeb——tomcat安装及目录介绍
  2. Linux学习之七--mysql的安装使用
  3. IOS修改webView背景透明以及IOS调用前台js的方法
  4. 状态模式(State Pattern)
  5. 启动app时全屏显示Default.png
  6. 用R分析时间序列(time series)数据
  7. oracle - redo 损坏或删除处理方法
  8. 免费开放的API
  9. 定位相关-CLLocationManager的使用。
  10. BZOJ1642: [Usaco2007 Nov]Milking Time 挤奶时间
  11. PHP记录点击数方法
  12. Error Unable to start the Genymotion virtual device.解决
  13. cornerstone the working copy is locked due to a previous文件lock解决办法
  14. TreeSet VS HashSet VS LinkedHashSet; TreeMap VS HashMap VS LinkedHashMap
  15. python之路--管道, 事件, 信号量, 进程池
  16. DotNetty 实现 Modbus TCP 系列 (二) ModbusFunction 类图及继承举例
  17. Luogu2839 Middle 主席树、二分答案
  18. Kafka 0.10问题点滴
  19. VirtualBox虚拟机安装Mac OS 10.12
  20. [CQOI2017]老C的任务

热门文章

  1. 在阿里云服务器中配置JDK、tomcat、mysql
  2. 红帽学习记录[RHCE] 防火墙与网络合作
  3. VLAN配置及Trunk接口配置
  4. element 时间限制 结束时间大于开始时间 数组形式
  5. CSV数据存取
  6. linux 相关零碎知识整理
  7. Nginx服务器部署 负载均衡 反向代理
  8. Python下定义输出日志
  9. “狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
  10. PAT甲级专题|树的遍历