首页 > 其他 > 详细

一些个大模拟

时间:2020-10-04 20:08:07      阅读:38      评论:0      收藏:0      [点我收藏+]

由于最近快要考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
‘‘‘
View Code

这题没啥好说的,就写就完事了

一些个大模拟

原文:https://www.cnblogs.com/yanlifneg/p/13768135.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!