由于最近快要考ccsp了
前几次都在大模拟上吃了亏
最近练习用java和python写一些
201912-3 化学方程式
class Element: def __init__(self, CH): self.ch = CH def __str__(self): return self.ch def __lt__(self, other): if len(self.ch) == len(other.ch): return self.ch < other.ch else: return len(self.ch) > len(other.ch) # 获取s从p开始的数字 def getNum(s, p): coor = 0 pos = p for i in range(p, len(s)): if s[i].isdigit(): coor = coor * 10 + int(s[i]) else: pos = i break return coor, pos # 获取元素字典 def get(s): for i in range(10): st = str(i) s = s.replace(st, "") s = s.replace("(", "") s = s.replace(")", "") s = s.replace("=", "") s = s.replace("+", "") s += "#" res = [] size = len(s) for i in range(size - 1): if s[i].islower(): continue if s[i + 1].islower(): res.append(s[i:i + 2]) else: res.append(s[i:i + 1]) res = set(res) chars = [] for it in res: Ele = Element(it) chars.append(Ele) chars = sorted(chars) return chars # 处理一个括号的部分 def dfs(s, chars, P, mp): # print("now solving " + s) # print("P is ") # print(P) size = len(chars) res = [0 for _ in range(size)] pos = 0 N = len(s) s = s + "#" while (pos < N): if s[pos].isdigit(): pos += 1 continue elif s[pos].islower(): pos += 1 continue elif s[pos] == ‘)‘: pos += 1 continue elif s[pos] == ‘(‘: start = pos end = pos + P[pos] coor = 1 Pos = end + 1 if start + 1 < end: tmp = dfs(s[start + 1:end], chars, P[start + 1: end], mp) if s[end + 1].isdigit(): coor, Pos = getNum(s, end + 1) for i in range(size): res[i] += tmp[i] * coor pos = Pos else: # assert (s[pos] >= "A" and s[pos] <= "Z") ST = s[pos] if s[pos + 1].islower(): ST += s[pos + 1] pos += 1 cor = 1 p = pos + 1 if s[pos + 1].isdigit(): cor, p = getNum(s, pos + 1) res[mp[ST]] += cor pos = p return res # 处理某个化学式 def cal(s, chars, mp): # print("solve " + s) size = len(chars) # print("solving : " + s) # for i in range(size): # assert (s.count(chr(i + 65)) <= 1) coor = 1 pos = 0 if s[0].isdigit(): coor, pos = getNum(s, 0) s = s[pos:] # print("now s : " + s) # print("coor : " + str(coor)) sLen = len(s) P = [0 for _ in range(sLen)] for i in range(sLen): if s[i] != ‘(‘: continue cnt = 1 for j in range(i + 1, sLen): if s[j] == ‘(‘: cnt += 1 elif s[j] == ‘)‘: cnt -= 1 if cnt == 0: P[i] = j - i break # print("s is : " + s) # print("( position is : ") # print(P) # res = [0 for _ in range(size)] res = dfs(s, chars, P, mp) for i in range(size): res[i] = res[i] * coor # print("ans is ") # print(res) return res # 处理=左右的式子 def sol(s, chars, mp): size = len(chars) res = [0 for _ in range(size)] ls = s.split("+") for it in ls: cnow = cal(it, chars, mp) for i in range(size): res[i] += cnow[i] return res # 处理整个方程式 def solve(s): chars = get(s) # for it in chars: # print(it.ch, end=‘ ‘) # print() size = len(chars) mp = {} for i in range(size): mp[chars[i].ch] = i # print("before replace : " + s) # rep = [chr(i + 65) for i in range(size)] # for i in range(size): # s = s.replace(chars[i].ch, rep[i]) # print("after replace : " + s) ls = s.split("=") # assert (len(ls) == 2) c1 = sol(ls[0], chars, mp) c2 = sol(ls[1], chars, mp) ok = 1 for i in range(len(chars)): if c1[i] != c2[i]: ok = 0 break if ok == 1: print("Y") else: print("N") if __name__ == ‘__main__‘: n = int(input()) for i in range(n): s = input() solve(s) ‘‘‘ 6 H2+O2=H2O 2H2+O2=2H2O H2+Cl2=2NaCl H2+Cl2=2HCl CH4+2O2=CO2+2H2O Cu+As=Cs+Au 4Au+8NaCN+2H2O+O2=4Na(Au(CN)2)+4NaOH 1 4Au+8NaCN+2H2O+O2=4Na(Au(CN)2)+4NaOH 1 CaCl2+2AgNO3=Ca(NO3)2+2AgCl 1 3Ba(OH)2+2H3PO4=6H2O+Ba3(PO4)2 1 CH4+2O2=CO2+2H2O ‘‘‘
这题没啥好说的,就写就完事了
原文:https://www.cnblogs.com/yanlifneg/p/13768135.html