Loading

Python识别璇玑图中诗的数量

一、璇玑图简介

璇玑图的读法有很多,这里我使用七七棋盘格的读法,在璇玑图中分离出一个七七棋盘格,如下表

针对上表所示的七七棋盘格图,在苏蕙璇玑图中,前人们总结了上百种很零碎的读法,让普通读者眼花缭乱。其实,我们可以用一句话就把前人的所有读法涵盖了,即,从这个棋盘格的任何一个“交叉结点字”起,沿任何一条线段阅读,当读完第4条线段时,一首七言四绝诗就诞生了,同时,该诗反序逆读后,也是另一首七言四绝诗!(注1:图3共有25个“交叉结点字”,它们分别是:吏、痞、鸡、戚、隶、婢、妾、姐、妻、妓、姊、弟、爷、爹、娣、蛇、姨、哥、子、鸽、嫡、娌、鹅、媳、蝎。注2:每个“线段”都由8个汉字连接而成,其中顶端的两个汉字就是两个“交叉结点字”)

二、算法实现

我们将上面的表格简化成一张图,如下所示:

璇玑图简化

代码如下:

class Gragh():
    def __init__(self, nodes, sides):
        '''
        nodes 表示点
        sides 表示边
        '''
        # self.sequense是字典,key是点,value是与key相连接的点
        self.sequense = {}
        # self.side是临时变量,主要用于保存与指定点相连接的点
        self.side = []
        for node in nodes:
            for side in sides:
                u, v = side
                # 指定点与另一个点在同一个边中,则说明这个点与指定点是相连接的点,则需要将这个点放到self.side中
                if node == u:
                    self.side.append(v)
                elif node == v:
                    self.side.append(u)
            self.sequense[node] = self.side  # 统计出各个节点与哪一些节点直接连接
            self.side = []
	'''
	做五个循环,五个点确定四句诗
	'''
    def search(self):
        res = []
        for i in range(1, 26):
            for j in self.sequense[i]:
                for k in self.sequense[j]:
                    if k != i:
                        for z in self.sequense[k]:
                            if z != j:
                                for y in self.sequense[z]:
                                    if y != k:
                                        a = [i, j, k, z, y]
                                        if a not in res:
                                            res.append(a)
        return res

if __name__ == "__main__":
    nodes = [i + 1 for i in range(25)]
    sides = [(1, 2), (2, 3), (3, 4), (4, 5), (1, 6), (1, 7), (2, 7), (3, 8), (4, 9), (5, 10), (5, 9), (6, 7),(7, 8), (8, 9), (9, 10), (6, 11), (7, 12), (7, 13), (8, 13), (9, 13),(9, 14), (10, 15), (11, 12), (12, 13), (13, 14), (14, 15), (11, 16), (12, 17), (13, 18), (13, 17),(13, 19), (14, 19), (15, 20), (16, 17), (17, 18), (18, 19), (19, 20), (16, 21), (17, 21), (17, 22),(18, 23), (19, 24), (19, 25), (20, 25), (21, 22), (22, 23), (23, 24), (24, 25)]
    G = Gragh(nodes, sides)
    print(len(G.search()))

运行结果

1558419864630

posted @ 2019-07-26 15:30  Jacob是我了  阅读(336)  评论(0编辑  收藏  举报