实验吧 迷宫大逃亡

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))

 

posted @ 2018-09-26 20:03  Tri0mphe  阅读(552)  评论(0编辑  收藏  举报