继续赛后马后炮系列--一个搜索题目

请注意,本文编写于 2193 天前,最后修改于 1778 天前,其中某些信息可能已经过时。

前言

西湖论剑,错过了。只有现在才可以。只好先把题目下载下来,半夜三根的慢慢做。

我的顺序是先 misc->web->pwn,其他题目我就真的做不来啦。

现在也先写一个 Misc 题目吧,题目如下:

资深宅 “flag {” 在朋友邀请下,参加了一场聚会。
在聚会上看到了美女 “75D}”, 一时心花荡漾、不能自己,坚信彼此就是天造地设的一双。
想通过层层朋友的关系认识她,却无奈性格问题,不敢劳师动众。
好在朋友帮忙搞到一张聚会人员关系图,如下:

[('Flo­raPrice','E11'),('Flo­raPrice','E9'),('Flo­raPrice','75D}'),('No­raFayet­te','E11'),('No­raFayet­te','E10'),('No­raFayet­te','E13'),('No­raFayet­te','E12'),('No­raFayet­te','E14'),('No­raFayet­te','E9'),('No­raFayet­te','E7'),('No­raFayet­te','E6'),('E10','Sylvi­aAvon­dale'),('E10','MyraLid­del'),('E10','He­len­L­loyd'),('E10','Katheri­naRogers'),('Ver­ne­Sander­son','E7'),('Ver­ne­Sander­son','E12'),('Ver­ne­Sander­son','E9'),('Ver­ne­Sander­son','E8'),('E12','He­len­L­loyd'),('E12','Katheri­naRogers'),('E12','Sylvi­aAvon­dale'),('E12','MyraLid­del'),('E14','Sylvi­aAvon­dale'),('E14','75D}'),('E14','Katheri­naRogers'),('France­sAnder­son','E5'),('France­sAnder­son','E6'),('France­sAnder­son','E8'),('France­sAnder­son','E3'),('Dorothy­Murchison','E9'),('Dorothy­Murchison','E8'),('Eve­lyn­J­ef­fer­son','E9'),('Eve­lyn­J­ef­fer­son','E8'),('Eve­lyn­J­ef­fer­son','E5'),('Eve­lyn­J­ef­fer­son','E4'),('Eve­lyn­J­ef­fer­son','E6'),('Eve­lyn­J­ef­fer­son','E1'),('Eve­lyn­J­ef­fer­son','E3'),('Eve­lyn­J­ef­fer­son','E2'),('RuthDe­Sand','E5'),('RuthDe­Sand','E7'),('RuthDe­Sand','E9'),('RuthDe­Sand','E8'),('He­len­L­loyd','E11'),('He­len­L­loyd','E7'),('He­len­L­loyd','E8'),('O­livi­aCar­leton','E11'),('O­livi­aCar­leton','E9'),('E­leanorNye','E5'),('E­leanorNye','E7'),('E­leanorNye','E6'),('E­leanorNye','E8'),('E9','There­saAn­der­son'),('E9','PearlOglethor­pe'),('E9','Katheri­naRogers'),('E9','Sylvi­aAvon­dale'),('E9','MyraLid­del'),('E8','There­saAn­der­son'),('E8','PearlOglethor­pe'),('E8','Katheri­naRogers'),('E8','Sylvi­aAvon­dale'),('E8','Bren­daRogers'),('E8','Lau­ra­Man­dev­ille'),('E8','MyraLid­del'),('E5','There­saAn­der­son'),('E5','Bren­daRogers'),('E5','Lau­ra­Man­dev­ille'),('E5','Char­lot­teM­c­Dowd'),('E4','Char­lot­teM­c­Dowd'),('E4','There­saAn­der­son'),('E4','Bren­daRogers'),('E7','There­saAn­der­son'),('E7','Sylvi­aAvon­dale'),('E7','Bren­daRogers'),('E7','Lau­ra­Man­dev­ille'),('E7','Char­lot­teM­c­Dowd'),('E6','There­saAn­der­son'),('E6','PearlOglethor­pe'),('E6','Bren­daRogers'),('E6','Lau­ra­Man­dev­ille'),('E1','Lau­ra­Man­dev­ille'),('E1','Bren­daRogers'),('E3','There­saAn­der­son'),('E3','Bren­daRogers'),('E3','Lau­ra­Man­dev­ille'),('E3','Char­lot­teM­c­Dowd'),('E3','flag{'),('E2','Lau­ra­Man­dev­ille'),('E2','There­saAn­der­son'),('Katheri­naRogers','E13'),('E13','Sylvi­aAvon­dale')]

你能在让最少人知道的情况下,帮助 flag 先生联系上 75D 小姐姐吗?
求节点 “flag {” 到 “75D” 的最短路径,即为 flag,比如:flag {E3Al­ice­BobXXXXXXXXXXXXXXXX75D}

很明显一个 BFS 搜索最短路径。

虽然说直接用手算就行,但是我一定要整一个软件出来

分析

我们先看上面这么多数据,我们假设把名字当成节点,En 当成 line。

我们就能分为两种分类,一种是 名字开头,成员是线的标准 node maps。

1
friendship = {'FloraPrice': ['E11', 'E9', '75D}'], 'NoraFayette': ['E11', 'E10', 'E13', 'E12', 'E14', 'E9', 'E7', 'E6'], 'VerneSanderson': ['E7', 'E12', 'E9', 'E8'], 'FrancesAnderson': ['E5', 'E6', 'E8', 'E3'], 'DorothyMurchison': ['E9', 'E8'], 'EvelynJefferson': ['E9', 'E8', 'E5', 'E4', 'E6', 'E1', 'E3', 'E2'], 'RuthDeSand': ['E5', 'E7', 'E9', 'E8'], 'HelenLloyd': ['E11', 'E7', 'E8'], 'OliviaCarleton': ['E11', 'E9'], 'EleanorNye': ['E5', 'E7', 'E6', 'E8'], 'KatherinaRogers': ['E13']}

另一种就是已线为节点,名字为成员的 初始 Line 搜索的图。

1
line = {'E10': ['SylviaAvondale', 'MyraLiddel', 'HelenLloyd', 'KatherinaRogers'], 'E12': ['HelenLloyd', 'KatherinaRogers', 'SylviaAvondale', 'MyraLiddel'], 'E14': ['SylviaAvondale', '75D}', 'KatherinaRogers'], 'E9': ['TheresaAnderson', 'PearlOglethorpe', 'KatherinaRogers', 'SylviaAvondale', 'MyraLiddel'], 'E8': ['TheresaAnderson', 'PearlOglethorpe', 'KatherinaRogers', 'SylviaAvondale', 'BrendaRogers', 'LauraMandeville', 'MyraLiddel'], 'E5': ['TheresaAnderson', 'BrendaRogers', 'LauraMandeville', 'CharlotteMcDowd'], 'E4': ['CharlotteMcDowd', 'TheresaAnderson', 'BrendaRogers'], 'E7': ['TheresaAnderson', 'SylviaAvondale', 'BrendaRogers', 'LauraMandeville', 'CharlotteMcDowd'], 'E6': ['TheresaAnderson', 'PearlOglethorpe', 'BrendaRogers', 'LauraMandeville'], 'E1': ['LauraMandeville', 'BrendaRogers'], 'E3': ['TheresaAnderson', 'BrendaRogers', 'LauraMandeville', 'CharlotteMcDowd', 'flag{'], 'E2': ['LauraMandeville', 'TheresaAnderson'], 'E13': ['SylviaAvondale']}

之后就很简单啦,首先我们 line 搜索出 flag {的初始线 E3。之后去 friend­ship 查找关系,更具 line 查找到 Node 名,然后加入 queue 防止重复搜索,然后继续遍历 Node 下的 line 依次反复,直到找到 end。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
queue = []
 
def get_line(txt):
    for i in line:
        if txt in line[i]:
            return i
def dfs(txt,target,vector):
    for i in friendship:
        if txt in friendship[i]:
            queue.insert(0,(i,txt))
            new = vector + i
            for j in friendship[i]:
                if j == target:
                    print(new+"75D}")
                    return
                if (i,j) not in queue:
                    new = new + j
                     
                    dfs(j,target,new)
    queue.pop()
dfs(get_line("flag{"), '75D}',"")

结果

TIM截图20190410133022.jpg
TIM截图20190410133022.jpg

从结果列表中找到最短的,然后加上 flag。

最后得出 flag 就是

flag{E3Eve­lyn­J­ef­fer­son­E9Flo­raPrice75D}

添加新评论

  • OωO
  • |´・ω・) ノ
  • ヾ (≧∇≦*) ゝ
  • (☆ω☆)
  • (╯‵□′)╯︵┴─┴
  •  ̄﹃ ̄
  • (/ω\)
  • ∠( ᐛ 」∠)_
  • (๑•̀ㅁ•́ฅ)
  • →_→
  • ୧(๑•̀⌄•́๑)૭
  • ٩(ˊᗜˋ*)و
  • (ノ °ο°) ノ
  • (´இ皿இ`)
  • ⌇●﹏●⌇
  • (ฅ´ω`ฅ)
  • (╯°A°)╯︵○○○
  • φ( ̄∇ ̄o)
  • ヾ (´・ ・`。) ノ "
  • (ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
  • (ó﹏ò。)
  • Σ(っ °Д °;) っ
  • (,,´・ω・)ノ"(´ っ ω・`。)
  • ╮(╯▽╰)╭
  • o(*////▽////*)q
  • >﹏<
  • ( ๑´•ω•) "(ㆆᴗㆆ)
  • (。•ˇ‸ˇ•。)
  • 😂
  • 😀
  • 😅
  • 😊
  • 🙂
  • 🙃
  • 😌
  • 😍
  • 😘
  • 😜
  • 😝
  • 😏
  • 😒
  • 🙄
  • 😳
  • 😡
  • 😔
  • 😫
  • 😱
  • 😭
  • 💩
  • 👻
  • 🙌
  • 🖕
  • 👍
  • 👫
  • 👬
  • 👭
  • 🌚
  • 🌝
  • 🙈
  • 💊
  • 😶
  • 🙏
  • 🍦
  • 🍉
  • 😣
  • 颜文字
  • 阿鲁
  • 泡泡
  • Emoji

已有 2 条评论

不用写啦,我有现成的,不仅有 BFS 还有 DFS (逃

⑨BIE ⑨BIE 回复 @Otstar Lin

这种不现写用轮子那还有什么比的意义(逃