2025春季学期云曦开学考复现(misc,re)

misc

指尖的诉说

打开图片宽高明显不对在这里插入图片描述
修复一下,对照盲文图在这里插入图片描述
(这里对照图找错了,应该要找英文和数字的忙文图)这里的红色对应字符,蓝色对应数字,每一行和每一行之间用-连接

空间站的密语

根据题目得到的信息,可能涉及sstv解密
在这里插入图片描述从github上下载sstv decode工具
找到文件夹,打开GBH输入

python setup.py install

接着把wav文件放在该文件夹下,输入

 sstv -d /d/tools/sstv/sstv-master/密语.wav -o result.png

在这里插入图片描述就分离出来了在这里插入图片描述根据附件里的密文,猜测是RC4加密在这里插入图片描述解密即可

实验室秘密流量流出

打开流量包,用协议分级查看一下在这里插入图片描述发现一张jpg图片和smtp流量,这是类似于微信qq的流量,这张图片是通过http来传输的,这张图片可以用蓝鲨的自带功能导出在这里插入图片描述就得到了目标图片在这里插入图片描述发现目标图片下面有提示在这里插入图片描述再去流量包里面去筛smtp包,发现后面有一串字符,后面有个=,感觉像base64加密,用赛博厨子查一下
在这里插入图片描述把那串字符整出来发现有中文和一张jpg,不确定是不是同一张,转出来看看,发现直接转转不出来,想到图片里还有个/9j/,这是base64转图片的起始标志加在前面就可以了在这里插入图片描述

破解曼德尔砖

下载的附件没有后缀,用随波逐流看了一下确实是jpg文件,看看属性在这里插入图片描述藏头诗,是四位数,不清楚是什么,接着找在这里插入图片描述暗示base16在这里插入图片描述发现含有压缩包,提取出来在这里插入图片描述要密码,而且文件前面有*标,说明是真加密,联想到最开始找到四位数,应该是要爆破了
在这里插入图片描述打开来是社会主义核心价值观加密在这里插入图片描述再试试随波逐流在这里插入图片描述

re

原码!启动

下载得到的附件用VSCODE打开发现是python文件
在这里插入图片描述这里调用了3个库,定义了 _kernalize()和redcordage()函数;从整个流程来看,运行整个程序后会要求输入内容,然后执行加密函数。

这里要注意,第一个函数引用了变量s,但是整个程序都没有出现过s这个变量,这里可以判断出第一个函数是干扰函数在这里插入图片描述接着看下面,发现在加密过程中只使用了x变量,而a变量没有输出,根据分析是冗余代码(干扰项)在这里插入图片描述接着分析加密过程:导入数据——经过redcordage()函数加密——base64加密

redcordage()函数加密过程

def redcordage(sakura, glg=0x1F):
    Franxx = []
    for i, char in enumerate(sakura):

        a = ord(char) ^ (glg + i %  111  )
        x = ord(char) ^ (glg + i % 8)

        a = ((x >> 6) | (x << 7)) & 0xFF
        x = ((x >> 3) | (x << 5)) & 0xFF

        a = ord(char) ^ (glg + i % 111)
        a = ((x >> 6) | (x << 7)) & 0xFF
        
        Franxx.append(x)
    return base64.b64encode(bytes(Franxx)).decode()

首先是引入变量Sakura和一个glg=0x1F;
设置了一个Franxx来储存循环语句中的结果;
然后调用了异或算法,而这个key就是之前提到的glg,值是0x1F;
接着调用了循环位移算法,先向右移3位,再向左移5位,通过|连接起来
最后再进行了base64加密

理清楚思路后,可以通过删除冗余代码来简化过程

import base64
def redcordage(sakura, glg=0x1F):
    Franxx = []
    for i, char in enumerate(sakura):
        x = ord(char) ^ (glg + i % 8)
        x = ((x >> 3) | (x << 5)) & 0xFF
        Franxx.append(x)
    return base64.b64encode(bytes(Franxx)).decode()
if __name__ == "__main__":
    text = input("这里就是加密flag的入口噢")
    print(redcordage(text))
#redcordage(text)=yKrpS0nrCELPgojiCMJoAmUiIgjIgmLCb0Ij6AiDo+gF4mIC4mIL

最后的解密脚本
在这里插入图片描述

厄里芬的秘密

检查文件类型在这里插入图片描述是一个64位的elf文件,用ida查看主调函数,发现这个程序实现了3个过程
1.验证用户是否输入111000011111
2.对用户输入进行RC4加密,并将结果和s2和V8比较
3.将每个字符都按位取反后与V6硬编码值比较
这题有两种解法,一种是静态解混淆函数,另一种是动态调试,这里用动调的办法来做

首先,配置动调环境
因为题目给的是elf文件,我这里用ida来调试
参考配置教程
首先分析这个程序的结构

puts(::s);
  fgets(s, 256, _bss_start);
  s[strcspn(s, "\n")] = 0;
  remove_spaces(s);
  if ( !strcmp(s, "111000011111") )             // 对用户输入进行比较
  {
    puts(asc_55FFDF90706D);
    fgets(s, 256, _bss_start);
    s[strcspn(s, "\n")] = 0;
    v4 = strlen(s);
    rc4_crypt((__int64)&unk_55FFDF907089, 3uLL, (__int64)s, v4, (__int64)s1);// RC4加密过程
    s2 = '\xC4\xD0\aR\xB3\xB7?8';
    v8 = '\xFF\xFF\xA2\x8F';
    if ( !memcmp(s1, &s2, 0xAuLL)               // 自身取反
      && (puts(asc_55FFDF907090), fgets(s, 256, _bss_start), s[strcspn(s, "\n")] = 0, strlen(s) == 11) )
    {
      for ( i = 0LL; ; ++i )
      {
        v5 = strlen(s);
        if ( i >= v5 )
          break;
        s[i] = ~s[i];
      }
      *(_QWORD *)v6 = '\x88\x8C\x86\x8C\x99\x98\x93\x88';
      *(_DWORD *)&v6[7] = '\x99\x98\x93\x88';
      if ( !memcmp(s, v6, 0xBuLL) )
      {
        complex_output((__int64)v10);
        puts(v10);
        puts(asc_55FFDF9070D0);
      }
      else
      {
        puts(asc_55FFDF90705D);
      }
      return 0;
    }
    else
    {
      puts(asc_55FFDF90705D);
      return 0;
    }
  }
  else
  {
    puts(asc_55FFDF90705D);
    return 0;
  }
}

按照之前说的三层加密,采用if嵌套结构进行硬比较,因为函数逻辑也比较简单,所以很好判断断点设置的位置在这里插入图片描述按照一般动调的逻辑来说,在比较的位置下断点,通过查看寄存器里放的东西来实现绕开加密过程“偷懒”在这里插入图片描述这里可以看到运行到第一个比较时右边RDX(寄存器)里藏着需要比较的数据,这样就可以得到需要我们输入的数据,以此类推
这是静态分析去解函数
RC4解密:
这题由于密钥很好找,就采用在线加密的方式解决
在这里插入图片描述在这里插入图片描述第三层自身取反

#*(_QWORD *)v6 = '\x88\x8C\x86\x8C\x99\x98\x93\x88';
#  *(_DWORD *)&v6[7] = '\x99\x98\x93\x88';
def hex_to_binary(s):
    bytes_list = s.replace('\\x','').split(' ')
    x = ''
    for byte in bytes_list:
        dec = int(byte,16)
        x += f"{dec:08b}"
    return x
def xor(x):
    y = ''.join('1' if bit == '0' else '0' for bit in x)
    return y
def binary_to_char(y):
    z = ''.join(chr(int(y[int(i):int(i)+8],2)) 
                for i in range(0,len(y),8))
    return z
def main():
    s =input('请输入十六进制字符串')
    return binary_to_char(xor(hex_to_binary(s)))
print(main())
     
#小端序 wlgfsyswlgf 

这里要注意,取反异或的时候要先将十六进制转换为2进制完成取反,接着将结果用char的格式输出
验证一下在这里插入图片描述

对于这道题的动调:
因为这道题的代码逻辑有创新,直接输入的数据与存在里面的数据不能直接比较,因为缺少对输入数据的逆向处理,所以还是要输入解密后的数据(约等于静态分析了)
这道题我也尝试过用栈溢出去绕过比较,但是这里的代码逻辑是三层if嵌套的强比较,只有是与不是,所以走不了这个近路
当然,这道题也可以去直接解那个混淆函数,难度很大不推荐

漫长的旅途

先查壳在这里插入图片描述64位的exe,有upx壳,还提示不要用upx -d直接脱壳,所以不要去铁头去直接脱壳了
分析一下为什么会这样,有一种情况,就是exe里的upx加壳的识别位被修改了,用010看一下在这里插入图片描述发现搜不到upx,说明这题是修改了标识位,现在就是要去找到修改后的内容,对于正常的upx加密内容,它的标识位是UPX0,UPX1,UPX2三段构成,看010标红的位置在这里插入图片描述发现了,UPX被改为APK了,将三个APK改成UPX就可以正常用upx脱壳了
在这里插入图片描述现在没壳了,直接用IDA打开,发现这题没有主调函数,只有start函数,追踪过去,同时在shift+F12查看中看到了迷宫在这里插入图片描述按照迷宫题的一般思路,需要找到迷宫的参数,控制方式,胜利方式等内容在这里插入图片描述发现了YXCZ分别控制上下左右在这里插入图片描述这里的59和29是迷宫的规格,因为要补零,所以规格是60列*30行,找到迷宫,shift+F12提取出来接下来就是整理
整理脚本

import re

def ida_to_ascii_array(file_path):
    ascii_array = []
    # 匹配0-255之间的十进制数字
    dec_pattern = re.compile(r'\b([0-9]{1,3})\b')
    
    with open(file_path, 'r') as f:
        for line in f:
            # 清理行内容:移除注释和结构符号
            clean_line = re.sub(r'//.*|\{|\}|;', '', line)
            
            # 提取并转换所有有效ASCII码
            
            bytes_list = [
                chr(int(num)) 
                for num in dec_pattern.findall(clean_line)
                if 0 < int(num) <= 255  # 排除0的情况
            ]
            
            ascii_array.extend(bytes_list)
    
    return ascii_array

if __name__ == "__main__":
    ascii_data = ida_to_ascii_array("迷宫.txt")
    print("转化的ASCII字符数量为:",len(ascii_data))

 # 第二步:转换为二维迷宫
    row = 30  # 迷宫行数
    col = 60  # 迷宫列数
 
# 检查数据量是否足够
    if len(ascii_data) < row * col:
        print(f"错误:需要{row}x{col}={row*col}个字符,实际得到{len(ascii_data)}")
    else:
        maze = []
        s = 0  # 数据索引
        
        for i in range(row):
            # 截取当前行数据
            maze.append(ascii_data[s:s+col])
            s += col
print(maze)
for r in maze:
    print(''.join(r))

题目也没说是要哪种路径,就用bfs和dfs寻路算法都尝试一遍
BFS算法

from collections import deque
 
#设置二维四向迷宫, 如果题目是多个小迷宫问题, 拆分多次调用脚本获取路径即可
maze = [['A', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '$'], ['$', '$', '$', '$', '$', '$', '$', '.', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.', '$', '$', '$', '$', '$', '$', '$', '$', '.', '.', '.', '.', '.', '.', '.', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.', '.', '.', '.', '.', '.', '.', '.', '$', '$', '$', '$', '$'], ['$', '$', '$', '$', '$', '$', '$', '.', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.', '$', '$', '$', '$', '$', '$', '$', '$', '.', '.', '.', '.', '.', '.', '.', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.', '.', '.', '.', '.', '.', '.', '.', '$', '$', '$', '$', '$'], ['$', '$', '$', '$', '$', '$', '$', '.', '$', '$', '$', '$', '$', '$', '$', '$', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.'], ['$', '$', '$', '$', '$', '$', '$', '.', '.', '.', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.', '$', '$', '$', '$', '$', '$', '$', '$', '.', '.', '.', '.', '.', '.', '.', '$', '$', '$', '$', '$', '$', '$', '$', '.', '$', '$', '$', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '$', '.'], ['$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.', '$', '.', '$', '$', '$', '$', '$', '$', '.', '$', '$', '$', '$', '$', '$', '$', '$', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '$', '$', '$', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '$', '.'], ['$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.', '.', '.', '$', '$', '$', '$', '$', '$', '.', '$', '$', '$', '$', '$', '$', '$', '$', '.', '.', '.', '.', '.', '.', '.', '.', '$', '$', '$', '$', '$', '$', '$', '.', '$', '$', '$', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '$', '.'], ['$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.', '.', '$', '$', '$', '.', '$', '$', '$', '$', '$', '$', '$', '$', '.', '$', '$', '$', '$', '$', '.', '$', '$', '$', '$', '$', '$', '$', '$', '.', '$', '$', '$', '.', '$', '.', '.', '.', '.', '.', '.', '.', '.', '.', '$', '.'], ['$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.', '$', '$', '$', '.', '$', '$', '$', '$', '$', '$', '$', '$', '.', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.', '$', '$', '$', '.', '.', '.', '.', '.', '.', '.', '$', '$', '$', '$', '$', '.'], ['$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.', '$', '$', '$', '.', '$', '$', '$', '$', '$', '$', '$', '$', '.', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.', '$', '$', '$', '.', '.', '.', '.', '.', '.', '.', '$', '$', '$', '$', '$', '.'], ['$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.', '.', '.', '.', '.', '.', '$', '$', '$', '.', '$', '$', '$', '$', '$', '$', '.', '.', '.', '.', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.', '$', '$', '$', '.', '.', '.', '.', '.', '.', '.', '$', '$', '$', '$', '$', '.'], ['$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.', '$', '$', '$', '.', '$', '$', '$', '$', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '$', '$', '$', '$', '$', '.'], ['$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.', '$', '$', '$', '.', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.', '$', '$', '$', '$', '.', '$', '$', '$', '.', '.', '.', '.', '.', '.', '$', '$', '$', '$', '$', '.'], ['$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.', '$', '$', '$', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '$', '$', '$', '$', '$', '$', '$', '$', '.', '$', '$', '$', '$', '.', '$', '$', '$', '$', '$', '$', '.', '$', '$', '$', '$', '$', '$', '$', '.'], ['$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.', '$', '$', '$', '$', '.', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.'], ['$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.', '$', '$', '$', '$', '.', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.'], ['$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '$', '$', '$', '$', '.', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.'], ['$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.', '$', '$', '$', '$', '.', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.'], ['$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.', '$', '$', '$', '$', '.', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.', '.'], ['$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.', '$', '$', '$', '$', '.', '$', '$', '$', '$', '$', '$', '$', '$', '.', '.', '.', '.', '.', '.', '$'], ['$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.', '$', '$', '$', '$', '.', '$', '$', '$', '$', '$', '$', '$', '$', '.', '$', '.', '$', '$', '.', '.'], ['$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.', '$', '$', '$', '$', '.', '$', '$', '$', '$', '$', '$', '$', '$', '.', '$', '.', '$', '$', '$', '.'], ['$', '$', '.', '.', '.', '.', '.', '.', '.', '.', '.', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.', '$', '$', '$', '$', '.', '$', '$', '$', '$', '$', '$', '$', '$', '.', '$', '.', '$', '$', '$', '.'], ['.', '.', '.', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '$', '.', '.', '.', '.', '.'], ['.', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.', '.', '.', '.', '.', '$', '$', '$', '$', '.', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.'], ['.', '$', '$', '$', '$', '$', '$', '$', '$', '.', '.', '.', '.', '.', '.', '$', '$', '$', '$', '$', '$', '.', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '$', '$', '$', '$', '.', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.'], ['.', '$', '$', '$', '$', '$', '$', '$', '$', '.', '.', '.', '.', '.', '.', '.', '.', '$', '$', '$', '$', '.', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.', '$', '$', '$', '$', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '$', '.'], ['.', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.', '.', '.', '.', '.', '.', '$', '$', '$', '$', '.', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.', '.', '$', '.', '.', '.', '$', '$', '$', '$', '$', '$', '$', '$', '.', '$', '.'], ['.', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.', '$', '$', '$', '$', '.', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '$', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.'], ['.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '$', '$', '$', '$', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '$', '.', 'B']]
path_len = 0x7fffffff#如果题目未给出终点坐标,则一定会指定路径的长度,在此处修改路径长度,否则请保留path_len的极大值
 
#进行BFS寻找路径
def bfs(start, end, barrier):
    directions = [(0, 1), (1, 0), (0, -1), (-1, 0)] # 定义四个方向的移动
    for i in range(len(maze)):#获取起点和终点在列表中的索引
        for j in range(len(maze[i])):
            if(maze[i][j] == start):
                start = (i, j)
            if(maze[i][j] == end):
                end = (i, j)
    #以下均是bfs算法套路
    queue = deque()
    queue.append((start, [start]))  # (当前位置, 路径)
    visited = set()
    visited.add(start)
    while queue:
        position, path = queue.popleft()
        if position == end:
            return path
        elif len(path)==path_len:
            return path
        for d in directions:
            next_position = (position[0] + d[0], position[1] + d[1])
            if 0 <= next_position[0] < len(maze) and 0 <= next_position[1] < len(maze[0]) and \
               maze[next_position[0]][next_position[1]] != barrier and next_position not in visited:
                queue.append((next_position, path + [next_position]))
                visited.add(next_position)
    return None
 
#执行BFS搜索并打印结果
if __name__ == '__main__':
    #maze[起点x坐标][起点y坐标] = 'A' #如果题目给了起点终点的坐标,在这里直接给起点和终点添加特征
    #maze[终点x坐标][终点y坐标] = 'B' 
    
    path = bfs('A', 'B', 1) #bfs函数传入参数代表起点、终点、障碍的特征(若题目给出的数据无特征, 手动添加特征即可, 通常障碍是1也有可能是0或其它字符如'#')
    print("移动路径坐标:", path)
    print("移动路径方位:{", end='')
    for i in range(1 ,len(path)):
        x1, y1, x2, y2 = path[i - 1][0], path[i - 1][1], path[i][0], path[i][1]
        if(x1 > x2):#上
            print("Y", end='')
        elif(x1 < x2):#下
            print("X", end='')
        elif(y1 > y2):#左
            print("C", end='')
        elif(y1 < y2):#右
            print("Z", end='')
    print('}')

得到路径
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值