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是我了  阅读(403)  评论(0)    收藏  举报