实验吧 迷宫大逃亡
0x01 题目介绍
根据题目的说明,编写代码达到题目的要求。即可得到flag,一般flag格式是ctf{},所以在编写的代码,最终结果可能需要转码操作
你掉进了一个连环迷宫, 这个连环迷宫总共有T个迷宫~
每个迷宫有如下信息:
迷宫大小n (表示这是n*n的迷宫)
迷宫入口坐标
迷宫出口坐标
迷宫地图(由'X', 'O'组成的n行n列的迷宫,'X'表示障碍物, 即不可走,'O'表示可走的道路)
如果能走出这个迷宫那么你将得到一个1,否则你将得到一个0
这T个 0/1就是你走出这个连环迷宫的钥匙
示例:
T=2时:
2
3
1 1
1 3
OXO
OOO
XXX
3
1 2
3 3
XOX
OOX
XXO
那么钥匙为:10
Hint:
这T个迷宫在in.txt文件里,这个文件第一行就是T, 接下来就是T个迷宫的信息
key值:CTF{xxxx}
0x02 分析
看这别人的writeup写了好久才写出来.一道简单的ACM题把我难倒了.用python写的DFS算法才搞出来.最后看了人家写的代码只能流泪.
0x03 代码
import base64 class mi_gong: def __init__(self,_len,_start,_end,_migong): self.len =_len #迷宫的大小 n*n self.start =_start #开始点 self.end = _end #终点 例:['3','5'] self.migong = _migong #迷宫 self.success = 0 #判断是否到达终点 self.arrived = [] #已经访问的 def run(self): return str(self.zou_migong()) def zou_migong(self): self.DFS(self.start) # print(self.arrived) if self.success ==1: return 1 return 0 #位置+1 def addx(self, x): x += 1 if x >= self.len: return x - 1 return x #位置-1 def subx(self, x): x -= 1 if x < 0: return x + 1 return x #采用深度优先搜索 def DFS(self,location): try: if self.migong[location[0]][location[1]] =="X" or location in self.arrived: return 0 else: self.arrived.append(location) #表示已访问过 if location == self.end: self.success =1 return 0 #上下左右遍历 shang =[self.subx(location[0]),location[1]] self.DFS(shang) you =[location[0],self.addx(location[1])] self.DFS(you) xia =[self.addx(location[0]),location[1]] self.DFS(xia) zuo =[location[0],self.subx(location[1])] self.DFS(zuo) except Exception as e: print(e) result ="" #最后的结果 with open('ins.txt','r') as f: migong_num =int(f.readline().strip()) #迷宫的数量 while(migong_num): m_len = int(f.readline().strip()) start = [int(x)-1 for x in f.readline().split()] end = [int(x)-1 for x in f.readline().split()] #生成迷宫 migong_list= [] for i in range(m_len): migong_list.append(f.readline().strip()) r =mi_gong(m_len,start,end,migong_list) result += str(r.run()) migong_num -= 1 f.close() print(result) ans ="" for i in range(0,len(result),8): ans+=chr(int(result[i:i+8],2)) print(ans) print(base64.b64decode(ans))