zoukankan      html  css  js  c++  java
  • 实验吧 迷宫大逃亡

    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))
  • 相关阅读:
    UOJ#424. 【集训队作业2018】count
    框架的 总结(nop)------添加功能
    c# 调用分页(控制器端的)与时间的格式
    c# 通过关键字查询
    c#导入导出 插入数据到用户表(nop框)
    Nop权限的使用
    联合结果集的原则
    简单的结果集联合
    UNION ALL
    联合结果集
  • 原文地址:https://www.cnblogs.com/Triomphe/p/9709266.html
Copyright © 2011-2022 走看看