|
发表于 2020-5-30 12:16:50
|
显示全部楼层
本楼为最佳答案
本帖最后由 java2python 于 2020-5-30 12:24 编辑
- #反应方程式
- class Chem_equation:
- def __init__(self,left,right):
- self.left = left
- self.right = right
- #打印方程式:a+b=c+d
- def get_equation(self):
- chem_equ = ""
- for l in range(0,len(self.left)):
- chem_equ = chem_equ + self.left[l] + "+"
- chem_equ = chem_equ[0:-1] + "="
- for r in range(0,len(self.right)):
- chem_equ = chem_equ + self.right[r] + "+"
- chem_equ = chem_equ[0:-1]
- return chem_equ
-
- #某元素是反应物的词典:(0)a+b=c+d (7)a+m=k+l 那么map中就有一条{'a':[0,7]}
- class React_map:
- react_element = {}
- @staticmethod
- def ele_in_equation_left(chem_list):
- for c in range(0,len(chem_list)):
- chem = chem_list[c]
- left = chem.left
- for l in range(0,len(left)):
- element = React_map.react_element.get(left[l])
- if element == None:
- React_map.react_element.update({left[l]:[c]})
- else:
- element.append(c)
- #搜索节点:
- class Srh_node:
- def __init__(self,equation_no,equafrom,routefrom):
- self.equation_no = equation_no #方程式编号
- self.equafrom = equafrom #本节点来自于方程式编号
- self.routefrom = routefrom #本节点来自于搜索队列号
- #初始化反应方程式列表
- def init_equation_list():
- chem_list = []
- chem_list.append(Chem_equation(['a','b'],['c','d']))
- chem_list.append(Chem_equation(['c'],['e','f']))
- chem_list.append( Chem_equation( ['f','g'],['a','h']))
- chem_list.append(Chem_equation(['c','g'],['d','h']))
- chem_list.append(Chem_equation(['d'],['m','n']))
- chem_list.append(Chem_equation(['m','g'],['b','x']))
- chem_list.append(Chem_equation(['s','t'],['u','v']))
- return chem_list
- #主程序
- def main():
- chem_list = init_equation_list()
- React_map.ele_in_equation_left(chem_list)
- #debug :打印方程式列表
- print("#################方程式列表")
- for i in range(0,len(chem_list)):
- print("<%d>%s" % (i,chem_list[i].get_equation()))
- #debug test:打印元素在左侧的方程式:元素,方程式列表
- print("#################元素在左侧的方程式:元素,方程式列表")
- for item in React_map.react_element.items():
- print(item[0],item[1])
- #搜索开始
- chem_list_visted = {} #已访问节点
- routes = [] #搜索路线,列表中保存搜索节点
- circles = [] #构成环路路线:保存字符串:方程式0->方程式4->方程式5->方程式0
- srh_node = Srh_node(0,0,0)
- routes.append(srh_node)
- #上次搜索指针,当前搜索指针(指向搜索队列)
- # 搜到的节点加入一个,当前搜索指针就加1,当前搜索指针>上次搜索指针意味搜索没有结束
- last_routes_ptr = 0
- cur_routes_ptr = 1
- #第一次从初节点开始,不断发展,知道发展不出新节点
- while cur_routes_ptr > last_routes_ptr:
- cur_routes_ptr_tmp = cur_routes_ptr
- #从上次搜索指针->当前搜索节点,也就是上次新发展的节点再发展
- for i in range(last_routes_ptr,cur_routes_ptr_tmp):
- #从队列取出一个节点(方程式)
- srh_node = routes[i]
- #该方程式取出右侧元素,对所有右侧元素循环
- right = chem_list[srh_node.equation_no].right
- for r in range(0,len(right)):
- #找出右侧元素在方程式左侧的方程式
- equations = React_map.react_element.get(right[r])
- if equations != None:
- #把这些方程式中没有访问过的,全部加入队列
- for e in range(0,len(equations)):
- if chem_list_visted.get(equations[e]) == None:
- if routes[0].equation_no == equations[e]:
- #回到初始节点
- circle_node = srh_node
- route_str = "->方程式" + str(circle_node.equation_no) + "->方程式0"
- while circle_node.equafrom != routes[0].equation_no:
- circle_node = routes[circle_node.routefrom]
- route_str = "->方程式" + str(circle_node.equation_no) + route_str
- route_str = "方程式0" + route_str
- circles.append(route_str)
- else:
- #非初始节点,且没有被访问过
- chem_list_visted.update({equations[e]:0})
- sub_node = Srh_node(equations[e],srh_node.equation_no,i)
- routes.append(sub_node)
- cur_routes_ptr += 1
- #搜索队列/上次搜索指针更新
- last_routes_ptr = cur_routes_ptr_tmp
- #debug test:打印所有从起点开始发展出来的两个节点之间连线
- print("#################所有从起点开始发展出来的两个节点之间连线")
- for r in range(0,len(routes)):
- srh_node = routes[r]
- no = srh_node.equation_no
- print("<%d:%s>来自于方程式编号:<%d:%s>" % (no,chem_list[no].get_equation(),srh_node.equafrom,chem_list[srh_node.equafrom].get_equation()))
- #打印所有构成环路的线路
- print("#################所有构成环路的线路")
- for c in range(0,len(circles)):
- print(circles[c])
- main()
复制代码
结果(只是以方程式0为起始点的一个列子,如果需要找出其他环路,那么再加一个外层循环:起始点就要遍历所有方程,
另外搜索中为了避免打转,标记了已访问节点,那么有些环路被忽视了:比如0->1->3,和0->1->2->3,因为第二条线路到3节点晚了,所有被忽视了):
#################方程式列表
<0>a+b=c+d
<1>c=e+f
<2>f+g=a+h
<3>c+g=d+h
<4>d=m+n
<5>m+g=b+x
<6>s+t=u+v
#################元素在左侧的方程式:元素,方程式列表
a [0]
b [0]
c [1, 3]
f [2]
g [2, 3, 5]
d [4]
m [5]
s [6]
t [6]
#################所有从起点开始发展出来的两个节点之间连线
<0:a+b=c+d>来自于方程式编号:<0:a+b=c+d>
<1:c=e+f>来自于方程式编号:<0:a+b=c+d>
<3:c+g=d+h>来自于方程式编号:<0:a+b=c+d>
<4:d=m+n>来自于方程式编号:<0:a+b=c+d>
<2:f+g=a+h>来自于方程式编号:<1:c=e+f>
<5:m+g=b+x>来自于方程式编号:<4:d=m+n>
#################所有构成环路的线路
方程式0->方程式1->方程式2->方程式0
方程式0->方程式4->方程式5->方程式0 |
|