题目背景
这是一道迷宫题,本来想偷懒找wp看,结果没搜到,只能自己来分析了。
题目: 最终 flag 为 flag{md5(path)},其中 md5 为 32 位小写
程序是linux 64位程序,无壳
程序分析
托入IDA,代码如下:
__int64 __fastcall main(int a1, char **a2, char **a3)
{
size_t v4; // rax
size_t v5; // rax
size_t v6; // rax
unsigned int v7; // [rsp+Ch] [rbp-3034h] BYREF
unsigned int v8; // [rsp+10h] [rbp-3030h] BYREF
__pid_t v9; // [rsp+14h] [rbp-302Ch]
ssize_t v10; // [rsp+18h] [rbp-3028h]
int pipedes[2]; // [rsp+20h] [rbp-3020h] BYREF
int fd[2]; // [rsp+28h] [rbp-3018h] BYREF
char s[16]; // [rsp+30h] [rbp-3010h] BYREF
char v14[16]; // [rsp+1030h] [rbp-2010h] BYREF
char buf[16]; // [rsp+2030h] [rbp-1010h] BYREF
unsigned __int64 v16; // [rsp+3038h] [rbp-8h]
v16 = __readfsqword(0x28u);
if ( pipe(pipedes) == -1 || pipe(fd) == -1 )
{
perror("pipe failed");
return 1;
}
else
{
v9 = fork();
if ( v9 == -1 )
{
perror("fork failed");
return 1;
}
else
{
if ( v9 )
{
close(pipedes[0]);
close(fd[1]);
read(fd[0], buf, 0x1000u);
puts("This is a maze game.you need to go from the upper left corner of the maze to the lower right corner.");
puts("The current interface only displays a 3*3 rectangular area centered on the current position.");
puts("You can use 'w''a''s''d' on your keyboard to move");
puts("Your flag is flag{md5(path)},and the path is the shortest path");
puts(aHintThePathLen);
printf("%s", buf);
while ( 1 )
{
__isoc99_scanf("%s", s);
system("clear");
v4 = strlen(s);
write(pipedes[1], s, v4 + 1);
if ( !strcmp(s, "exit") )
break;
memset(buf, 0, 0x64u);
read(fd[0], buf, 0x64u);
puts(buf);
}
close(fd[0]);
close(pipedes[1]);
}
else
{
close(fd[0]);
close(pipedes[1]);
v7 = 1;
v8 = 1;
sub_1469(v14, 1, 1);
sleep(0);
v5 = strlen(v14);
write(fd[1], v14, v5 + 1);
while ( 1 )
{
memset(buf, 0, 0x1000u);
v10 = read(pipedes[0], buf, 0x1000u);
if ( !strcmp(buf, "exit") )
break;
sub_168F(buf, (unsigned int)v10, &v7, &v8);
memset(v14, 0, 0x1000u);
sub_1469(v14, v7, v8);
sleep(0);
v6 = strlen(v14);
write(fd[1], v14, v6 + 1);
}
close(pipedes[0]);
close(fd[1]);
}
return 0;
}
}
}
程序用到了pipe和fork,父进程主要用于打印如下内容:
This is a maze game.you need to go from the upper left corner of the maze to the lower right corner.
The current interface only displays a 3*3 rectangular area centered on the current position.
You can use 'w''a''s''d' on your keyboard to move
Your flag is flag{md5(path)},and the path is the shortest path
hint:The path length is 936!!!!So don't think about doing it manually
根据提示,路径长度为936,手动肯定不行了。
前置知识
先来看看fork和pipe相关的知识点
Linux fork() 函数详解
fork() 是Unix和类Unix操作系统(如Linux)中的一个系统调用,用于创建新进程。它是一个非常重要的系统调用,是Unix进程管理的基础。
基本概念
当一个进程调用fork()时,系统会创建一个新的进程,这个新进程几乎完全复制了原进程的所有属性:
- 程序计数器
- 寄存器状态
- 内存映像
- 文件描述符表
- 环境变量等
工作原理
- 调用fork()后,系统创建一个新进程,这个新进程被称为子进程。
- 子进程获得父进程的数据空间、堆栈和堆的副本。
- 返回值不同:
- 在父进程中,fork()返回子进程的PID(正整数)
- 在子进程中,fork()返回0
- 如果出现错误,返回-1
示例代码
下面是一个简单的C语言示例来说明fork()的工作方式:
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
int main() {
pid_t pid = fork();
if (pid == -1) {
perror("Fork failed");
return 1;
} else if (pid == 0) {
// 子进程执行部分
printf("这是子进程,PID: %d, 父进程PID: %d\n", getpid(), getppid());
} else {
// 父进程执行部分
printf("这是父进程,PID: %d, 创建的子进程PID: %d\n", getpid(), pid);
wait(NULL); // 等待子进程结束
}
return 0;
}
特点
-
写时复制(Copy-on-Write):现代Unix系统使用写时复制技术来优化fork()性能。父进程和子进程开始时共享相同的物理内存页,只有当其中一个进程试图修改内存时,系统才会创建新的内存页。
-
独立性:父进程和子进程是独立的,它们可以各自执行不同的代码路径。
-
资源继承:子进程继承了父进程的大部分属性,但有一些例外(如进程ID、父进程ID等)。
使用场景
- 创建新进程:最常见的用途是创建新进程来执行不同的任务
- 并行处理:利用多核CPU进行并行计算
- 守护进程:创建后台服务进程
注意事项
- 错误检查:总是要检查fork()的返回值,确保进程创建成功
- 僵尸进程:父进程需要通过wait()或waitpid()等待子进程结束,避免产生僵尸进程
- 资源管理:确保正确关闭文件描述符和其他资源
与其他进程创建方法的区别
- fork():创建一个完全相同的子进程
- vfork():轻量级fork(),父子进程共享内存空间
- clone():更通用的接口,允许更多控制参数
fork()是Unix/Linux系统编程中最重要的概念之一,理解它是掌握进程管理和并发编程的关键。
Linux管道(pipe)是一种进程间通信(IPC)机制,允许一个进程的输出直接作为另一个进程的输入。管道是Unix/Linux系统中最基本的IPC方式之一。
管道的基本概念
管道是一种半双工的通信方式,数据只能单向流动。它提供了一个无名的、驻留在内存中的缓冲区,用于连接两个相关的进程。
管道的类型
1. 匿名管道(Anonymous Pipe)
- 用于父子进程或兄弟进程之间的通信
- 使用pipe()系统调用创建
- 当所有相关进程关闭管道后,管道自动销毁
2. 命名管道(Named Pipe/FIFO)
- 通过mkfifo()系统调用创建,具有文件系统路径名
- 可以用于不相关的进程间的通信
- 需要手动删除
管道的工作原理
当创建一个管道时,系统会分配一个缓冲区,并返回两个文件描述符:
- 读端(fd[0]):用于读取数据
- 写端(fd[1]):用于写入数据
实际应用示例
在shell中,管道使用竖线符号(|)表示:
ls | grep ".py" # ls命令的输出作为grep的输入
cat file.txt | wc -l # 计算文件行数
ps aux | grep python # 查找Python进程
在C语言中的实现
#include <unistd.h>
#include <stdio.h>
#include <sys/wait.h>
int main() {
int pipefd[2];
pid_t cpid;
char buf;
if (pipe(pipefd) == -1) { // 创建管道
perror("pipe");
return 1;
}
cpid = fork(); // 创建子进程
if (cpid == 0) { // 子进程
close(pipefd[1]); // 关闭写端
while (read(pipefd[0], &buf, 1) > 0) // 从管道读取
write(STDOUT_FILENO, &buf, 1);
close(pipefd[0]);
_exit(0);
} else { // 父进程
close(pipefd[0]); // 关闭读端
write(pipefd[1], "Hello World\n", 12); // 向管道写入
close(pipefd[1]);
wait(NULL); // 等待子进程结束
}
return 0;
}
管道的特点
- 同步性:如果管道为空,读操作会被阻塞;如果管道满,写操作会被阻塞
- 顺序性:数据按写入顺序读出
- 大小限制:管道容量有限(通常是4KB或64KB)
- 一次性:数据一旦被读取就从管道中消失
管道的局限性
- 半双工:数据只能单向流动(虽然双向管道可以通过创建两个单向管道实现)
- 仅限于相关进程:匿名管道只适用于有共同祖先的进程
- 容量限制:管道缓冲区大小有限
高级管道概念
重定向和管道组合
command1 > file.txt | command2 # 错误语法
command1 | command2 > file.txt # 正确语法
多级管道
cmd1 | cmd2 | cmd3 | cmd4
管道是Unix哲学的重要组成部分:"做一件事并做好",通过管道将多个简单工具连接起来完成复杂任务。
管道的实际应用场景
- 日志处理:
tail -f /var/log/access.log | grep error | wc -l
- 数据过滤:
find . -name "*.txt" | xargs grep "pattern"
- 系统监控:
ps aux | grep httpd | awk '{print $2}' | xargs kill
子进程分析
sub_1469(v14, 1, 1); 先打印出迷宫左上角的3x3的区域
- 然后通过pipe读取用户输入的值,最大1000个
sub_168F(buf, (unsigned int)v10, &v7, &v8); 根据用户输入判定迷宫是否能通行
- 再次执行
sub_1469(v14, v7, v8); 画出新坐标点为中心的3x3迷宫
根据 sub_1469 的逻辑,走到(97, 97)为成功,可以判断迷宫加上障碍为99x99的矩阵,
同时根据 sub_1469 的逻辑,可以解密迷宫,有如下代码:
static unsigned char __fastcall decrypt_maze(unsigned char* encryptedMaze, int realPos)
{
_BYTE Key[] = "tgrddf55";
return encryptedMaze[realPos] ^ Key[realPos % 8];
}
static unsigned char __fastcall Calc_maze(unsigned char* encryptedMaze, int row, int col)
{
return decrypt_maze(encryptedMaze, (99 * row + col) / 8) >> (7 - (99 * row + col) % 8) & 1;
}
static unsigned char __fastcall Set_maze(unsigned char* encryptedMaze, int row, int col)
{
int v4; // [rsp+1Ch] [rbp-4h]
v4 = Calc_maze(encryptedMaze, row, col);
if (!v4)
return 32;
if (v4 == 1)
return 49;
return 101;
}
unsigned char encryptedMaze[] = { 0x8b, 0x98, 0x8d, 0x9b, 0x9b, 0x99, 0xca, 0xca, 0x8b, 0x98, 0x8d, 0x9b, 0x94, 0x22, 0x74, 0x25,
0x70, 0x26, 0x76, 0x64, 0x74, 0x72, 0x35, 0x75, 0x63, 0xcc, 0xd9, 0xce, 0x9a, 0xcd, 0xdb, 0x8a,
0x8e, 0x9d, 0xcd, 0xcf, 0x9e, 0xb3, 0x20, 0x20, 0x34, 0x23, 0x62, 0x35, 0x60, 0x22, 0x61, 0x71,
0x30, 0x3d, 0xc8, 0xde, 0xcf, 0x99, 0xcf, 0xce, 0xca, 0xd9, 0xc8, 0xcf, 0x9a, 0xdd, 0x24, 0x64,
0x31, 0x26, 0x32, 0x35, 0x65, 0x72, 0x24, 0x20, 0x30, 0x36, 0x1d, 0xce, 0x8b, 0xcd, 0x9e, 0xcf,
0xcb, 0xc9, 0x99, 0x8a, 0xcf, 0xcd, 0x99, 0x70, 0x25, 0x73, 0x37, 0x25, 0x34, 0x72, 0x64, 0x74,
0x60, 0x72, 0x67, 0x8f, 0xca, 0x9c, 0xce, 0x9e, 0xdf, 0x99, 0x98, 0x9f, 0x8f, 0x8c, 0x9b, 0x84,
0x30, 0x37, 0x32, 0x71, 0x35, 0x26, 0x24, 0x74, 0x25, 0x62, 0x26, 0x32, 0x8a, 0x8c, 0xca, 0xcf,
0xdf, 0x8c, 0x8c, 0x8f, 0xce, 0x9c, 0x8f, 0xdf, 0xb0, 0x76, 0x22, 0x65, 0x75, 0x63, 0x31, 0x24,
0x30, 0x23, 0x22, 0x21, 0x7b, 0x9c, 0xdf, 0xca, 0xdf, 0x89, 0xcc, 0xde, 0x8f, 0x89, 0x8a, 0xcb,
0xcf, 0x66, 0x33, 0x34, 0x71, 0x77, 0x75, 0x61, 0x25, 0x26, 0x76, 0x64, 0x34, 0x08, 0x9b, 0xdf,
0x8e, 0x9d, 0x9d, 0xde, 0xde, 0x8c, 0xda, 0x8a, 0x9e, 0x8a, 0x66, 0x25, 0x25, 0x23, 0x64, 0x31,
0x25, 0x23, 0x33, 0x71, 0x65, 0x33, 0x9a, 0xda, 0x9b, 0xc9, 0xd8, 0x8a, 0xcf, 0x8d, 0xda, 0x9f,
0xdb, 0x8d, 0xc6, 0x61, 0x60, 0x72, 0x65, 0x71, 0x21, 0x66, 0x37, 0x71, 0x30, 0x77, 0x23, 0xcf,
0xda, 0x9c, 0xd9, 0x9e, 0x8e, 0x9d, 0xdf, 0xdf, 0xde, 0x9d, 0x8c, 0xb5, 0x30, 0x26, 0x70, 0x75,
0x35, 0x26, 0x32, 0x35, 0x30, 0x27, 0x65, 0x6f, 0xde, 0xc8, 0x88, 0x8f, 0x9b, 0x99, 0x9e, 0xdb,
0x9a, 0x99, 0x98, 0x8f, 0x71, 0x33, 0x25, 0x64, 0x30, 0x77, 0x37, 0x21, 0x71, 0x72, 0x24, 0x30,
0x0f, 0xdc, 0xd8, 0x9e, 0x8a, 0xdc, 0xde, 0x8f, 0xda, 0xc9, 0xdc, 0x9b, 0xc9, 0x77, 0x20, 0x71,
0x25, 0x76, 0x66, 0x20, 0x30, 0x23, 0x71, 0x25, 0x71, 0xdc, 0xc8, 0x8e, 0xdf, 0xc9, 0x8b, 0xce,
0xcf, 0x89, 0xd9, 0x9b, 0xcb, 0xd7, 0x65, 0x70, 0x20, 0x23, 0x63, 0x61, 0x61, 0x63, 0x20, 0x31,
0x61, 0x20, 0xd9, 0x9a, 0xde, 0xdd, 0xce, 0x9b, 0xcb, 0xd9, 0xdc, 0xdf, 0xdf, 0xcd, 0xf1, 0x24,
0x60, 0x33, 0x72, 0x21, 0x74, 0x72, 0x61, 0x24, 0x31, 0x62, 0x29, 0x9e, 0xca, 0xdc, 0xca, 0xde,
0xce, 0xdd, 0x98, 0x9b, 0xcf, 0xd9, 0x9e, 0x74, 0x65, 0x62, 0x32, 0x71, 0x70, 0x32, 0x64, 0x64,
0x70, 0x27, 0x63, 0x0f, 0xdb, 0x88, 0x9a, 0xcf, 0xce, 0xdd, 0x98, 0xce, 0xcf, 0x98, 0xcf, 0xd8,
0x65, 0x62, 0x27, 0x64, 0x20, 0x32, 0x70, 0x20, 0x21, 0x67, 0x22, 0x35, 0xdf, 0xc9, 0x9f, 0x8a,
0xcb, 0x89, 0xcc, 0xcf, 0xce, 0xd9, 0x9f, 0xce, 0xc0, 0x73, 0x63, 0x30, 0x74, 0x22, 0x74, 0x60,
0x61, 0x33, 0x76, 0x30, 0x22, 0xd8, 0xce, 0xdf, 0xcf, 0x8d, 0xdd, 0xce, 0x9e, 0xcd, 0x8a, 0xcf,
0xcf, 0xb3, 0x62, 0x65, 0x60, 0x23, 0x61, 0x60, 0x34, 0x32, 0x77, 0x64, 0x70, 0x7c, 0x9f, 0xca,
0x9b, 0x9d, 0xd8, 0x8e, 0xcb, 0x9c, 0x8a, 0x9a, 0x8a, 0x9c, 0x67, 0x74, 0x65, 0x76, 0x64, 0x64,
0x71, 0x76, 0x23, 0x75, 0x60, 0x22, 0x4b, 0xcb, 0x8b, 0x89, 0x89, 0x8a, 0x9a, 0xcc, 0x9f, 0x9b,
0x9e, 0x89, 0xce, 0x75, 0x74, 0x23, 0x24, 0x31, 0x65, 0x76, 0x67, 0x30, 0x75, 0x23, 0x24, 0x8b,
0xdb, 0xdd, 0xdc, 0xde, 0x9a, 0xc9, 0xcb, 0x9b, 0x9b, 0x89, 0xdc, 0xd0, 0x71, 0x62, 0x71, 0x64,
0x24, 0x76, 0x76, 0x75, 0x75, 0x63, 0x20, 0x23, 0x8f, 0xcc, 0xcc, 0x8e, 0xce, 0x99, 0xdb, 0x8e,
0x9a, 0x9d, 0xdc, 0xca, 0xa5, 0x63, 0x21, 0x64, 0x21, 0x37, 0x66, 0x21, 0x21, 0x66, 0x71, 0x60,
0x6a, 0xdc, 0x88, 0xce, 0x9e, 0xcd, 0xcf, 0xda, 0xda, 0xd8, 0x8d, 0x8e, 0x8b, 0x77, 0x35, 0x61,
0x25, 0x32, 0x33, 0x20, 0x20, 0x36, 0x71, 0x21, 0x34, 0x08, 0xcd, 0x9e, 0x9e, 0xdc, 0xde, 0x9e,
0x9e, 0x8c, 0xd8, 0xde, 0xdb, 0x8a, 0x74, 0x35, 0x35, 0x76, 0x33, 0x30, 0x61, 0x22, 0x31, 0x64,
0x31, 0x62, 0xc9, 0x8b, 0x9b, 0xd9, 0x9a, 0xdf, 0xcf, 0xc9, 0x9d, 0x9f, 0xcb, 0xcc, 0x81, 0x74,
0x30, 0x73, 0x62, 0x21, 0x70, 0x22, 0x64, 0x31, 0x60, 0x66, 0x24, 0xdf, 0xce, 0xdc, 0xde, 0xdf,
0xcf, 0xdc, 0x9c, 0x8a, 0x9a, 0x99, 0xdb, 0xe5, 0x30, 0x36, 0x23, 0x60, 0x35, 0x77, 0x31, 0x20,
0x30, 0x37, 0x33, 0x7f, 0x9f, 0xdd, 0xdf, 0xce, 0x8f, 0xdc, 0xcc, 0xda, 0xca, 0xcd, 0xde, 0x9a,
0x65, 0x26, 0x37, 0x65, 0x25, 0x62, 0x24, 0x21, 0x60, 0x22, 0x33, 0x21, 0x1a, 0xc9, 0x9f, 0x8a,
0xcf, 0xd8, 0x89, 0xca, 0x8a, 0x89, 0x9e, 0xda, 0xd8, 0x32, 0x66, 0x24, 0x20, 0x36, 0x74, 0x60,
0x74, 0x26, 0x67, 0x60, 0x61, 0xcc, 0x9f, 0xda, 0x9f, 0xdd, 0x99, 0xce, 0xdb, 0x89, 0x9f, 0x8b,
0x8b, 0xd3, 0x37, 0x21, 0x65, 0x66, 0x70, 0x64, 0x65, 0x63, 0x33, 0x34, 0x25, 0x60, 0xca, 0x9b,
0xdb, 0x88, 0x8c, 0x8f, 0x9f, 0xd8, 0xda, 0x8e, 0x9f, 0x89, 0xb3, 0x60, 0x71, 0x62, 0x31, 0x71,
0x34, 0x73, 0x32, 0x70, 0x21, 0x27, 0x2a, 0x8a, 0x8a, 0x89, 0x8c, 0xda, 0xca, 0xd8, 0x9a, 0xcb,
0xce, 0xcc, 0x89, 0x70, 0x64, 0x77, 0x25, 0x71, 0x60, 0x33, 0x66, 0x74, 0x74, 0x33, 0x31, 0x5f,
0xcb, 0x89, 0x9c, 0xdf, 0xdb, 0x8c, 0x8b, 0x8f, 0x8f, 0x8d, 0xcc, 0xd9, 0x30, 0x72, 0x64, 0x61,
0x25, 0x62, 0x26, 0x75, 0x25, 0x77, 0x65, 0x24, 0xce, 0xdd, 0x98, 0x8e, 0xde, 0xc8, 0x8f, 0x8a,
0x9b, 0xd9, 0x89, 0x9b, 0xd5, 0x22, 0x64, 0x70, 0x34, 0x33, 0x32, 0x20, 0x60, 0x62, 0x25, 0x75,
0x72, 0xc8, 0xc8, 0x8a, 0xcb, 0x9d, 0xda, 0xce, 0xce, 0x98, 0xc8, 0x9f, 0x9a, 0xb3, 0x31, 0x24,
0x70, 0x27, 0x32, 0x25, 0x75, 0x26, 0x31, 0x65, 0x30, 0x3d, 0xdd, 0x9a, 0x9a, 0x8d, 0xde, 0x8e,
0xca, 0xc8, 0x8c, 0x9f, 0xde, 0xdd, 0x70, 0x35, 0x34, 0x22, 0x63, 0x70, 0x34, 0x33, 0x30, 0x25,
0x30, 0x33, 0x1d, 0xcb, 0xdb, 0xd8, 0xce, 0x8f, 0xcf, 0x89, 0xdc, 0xca, 0x9f, 0xdc, 0x88, 0x24,
0x64, 0x77, 0x32, 0x20, 0x30, 0x22, 0x21, 0x64, 0x24, 0x33, 0x27, 0xce, 0x8e, 0x99, 0xda, 0xce,
0xca, 0xcd, 0x8d, 0xde, 0x8e, 0x9c, 0x8f, 0x80, 0x35, 0x27, 0x76, 0x75, 0x20, 0x73, 0x71, 0x31,
0x25, 0x26, 0x63, 0x72, 0xdb, 0x88, 0x8b, 0xcf, 0xcf, 0xd8, 0xd9, 0xdb, 0xce, 0xcd, 0x8b, 0xdb,
0xa4, 0x66, 0x66, 0x21, 0x74, 0x22, 0x24, 0x34, 0x61, 0x72, 0x26, 0x20, 0x3f, 0xd9, 0xca, 0x9b,
0xcb, 0x9c, 0xc9, 0xdb, 0x8e, 0xc8, 0x9f, 0x9b, 0x9f, 0x73, 0x66, 0x20, 0x70, 0x67, 0x30, 0x25,
0x25, 0x32, 0x66, 0x30, 0x61, 0x1c, 0x8f, 0x9e, 0x9a, 0xd9, 0xcd, 0xdf, 0x8e, 0x8d, 0x9b, 0xcf,
0xcb, 0xcb, 0x36, 0x30, 0x25, 0x66, 0x61, 0x34, 0x61, 0x32, 0x76, 0x24, 0x30, 0x63, 0x8a, 0xdf,
0x8f, 0x98, 0x89, 0xdb, 0xde, 0xcc, 0x8a, 0xca, 0x8f, 0xd8, 0xc2, 0x60, 0x30, 0x26, 0x31, 0x75,
0x65, 0x26, 0x62, 0x74, 0x60, 0x62, 0x32, 0xcb, 0x9e, 0xdd, 0x8c, 0xdf, 0x9f, 0xc8, 0xce, 0xcf,
0x8a, 0xd8, 0xcd, 0xa4, 0x75, 0x22, 0x64, 0x24, 0x35, 0x22, 0x63, 0x25, 0x34, 0x76, 0x24, 0x2e,
0x8a, 0x89, 0x88, 0xcb, 0xcf, 0xdd, 0x8b, 0x9a, 0xde, 0x9c, 0x88, 0xcf, 0x74, 0x22, 0x75, 0x61,
0x65, 0x76, 0x62, 0x71, 0x60, 0x22, 0x74, 0x24, 0x0e, 0x98, 0x9d, 0x9a, 0x9f, 0x9d, 0x8e, 0xcb,
0xdb, 0x99, 0x98, 0x9a, 0x99, 0x76, 0x24, 0x35, 0x24, 0x26, 0x62, 0x70, 0x20, 0x27, 0x30, 0x65,
0x65, 0xdd, 0x88, 0x9b, 0xce, 0x9c, 0x8e, 0xcf, 0xdb, 0x8c, 0xcc, 0xde, 0x9a, 0xd7, 0x74, 0x25,
0x60, 0x37, 0x22, 0x34, 0x20, 0x67, 0x61, 0x65, 0x31, 0x70, 0xd9, 0xda, 0x9e, 0x8d, 0xce, 0xcf,
0x8b, 0x9c, 0x98, 0xcf, 0x9a, 0xc8, 0xf0, 0x71, 0x24, 0x76, 0x63, 0x60, 0x30, 0x67, 0x74, 0x21,
0x34, 0x32, 0x68, 0xdf, 0x8e, 0x98, 0xcf, 0x8b, 0x9e, 0xdc, 0xd9, 0x8a, 0x8f, 0x8c, 0x9a, 0x61,
0x34, 0x37, 0x23, 0x35, 0x61, 0x27, 0x60, 0x25, 0x65, 0x23, 0x36, 0x1e, 0xdf, 0x98, 0xdb, 0x9f,
0xca, 0xc8, 0x98, 0xdf, 0x9a, 0x88, 0xca, 0xd9, 0x35, 0x66, 0x66, 0x75, 0x30, 0x73, 0x34, 0x74,
0x34, 0x22, 0x72, 0x61, 0xdb, 0x89, 0x9f, 0xca, 0x9e, 0xd9, 0xc9, 0x8b, 0xce, 0x89, 0x9a, 0xcb,
0xc4, 0x67, 0x63, 0x64, 0x65, 0x22, 0x35, 0x31, 0x70, 0x23, 0x73, 0x64, 0x63, 0x99, 0xca, 0xca,
0x8b, 0x98, 0x8d, 0x9b, 0x9b, 0x99, 0xca, 0xca, 0x8b, 0xe7
};
_DWORD rowMask[] = { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0 };
_DWORD colMask[] = { 0xFFFFFFFF, 0, 1, 0, 0xFFFFFFFF, 0, 1, 0, 0xFFFFFFFF, 0, 1, 0, 0, 0, 0, 0 };
static char* __fastcall Init_maze(char** maze, int row, int col)
{
for (int i = 0; i <= 2; ++i)
maze[row - 1][col - 1 + i] = Set_maze(encryptedMaze, rowMask[i] + row, colMask[i] + col);
for (int j = 4; j <= 6; ++j)
maze[row][col - 1 + j - 4] = Set_maze(encryptedMaze, rowMask[j] + row, colMask[j] + col);
for (int k = 8; k <= 10 ; ++k)
maze[row + 1][col - 1 + k - 8] = Set_maze(encryptedMaze, rowMask[k] + row, colMask[k] + col);
return 0;
}
int main(void)
{
system("chcp 65001");
char ** maze = (char**)malloc(99 * sizeof(char*));
if (maze)
{
memset(maze, 0, 99 * sizeof(char*));
for (int i = 0; i < 99; i++)
{
maze[i] = (char*)malloc(100);
if (maze[i])
{
memset(maze[i], 48, 100);
maze[i][99] = 0;
}
}
for (int i = 1; i < 99; i = i + 3)
{
for (int j = 1; j < 99; j = j + 3)
{
Init_maze(maze, i, j);
}
}
for (int i = 0; i < 99; i++)
printf("%s\n", maze[i]);
for (int i = 0; i < 99; i++)
{
if (maze[i])
{
free(maze[i]);
maze[i] = NULL;
}
}
free(maze);
maze = NULL;
}
return 0;
}
迷宫解法
得到迷宫数据后,编写解迷宫代码:
typedef struct _stPOS
{
int x;
int y;
} stPOS;
static BOOL NextW(const char** maze, stPOS start, stPOS end, char* path, int pathCnt);
static BOOL NextA(const char** maze, stPOS start, stPOS end, char* path, int pathCnt);
static BOOL NextS(const char** maze, stPOS start, stPOS end, char* path, int pathCnt);
static BOOL NextD(const char** maze, stPOS start, stPOS end, char* path, int pathCnt);
static BOOL NextW(const char** maze, stPOS start, stPOS end, char* path, int pathCnt)
{
BOOL result = FALSE;
path[pathCnt++] = 'w';
start.x -= 1;
if (start.x > 0 && maze[start.x - 1][start.y] != '1')
{
int ret = NextW(maze, start, end, path, pathCnt);
result |= ret;
}
if (start.y > 0 && maze[start.x][start.y - 1] != '1')
{
int ret = NextA(maze, start, end, path, pathCnt);
result |= ret;
}
if (start.y < end.y && maze[start.x][start.y + 1] != '1')
{
int ret = NextD(maze, start, end, path, pathCnt);
result |= ret;
}
return FALSE;
}
static BOOL NextD(const char** maze, stPOS start, stPOS end, char* path, int pathCnt)
{
BOOL result = FALSE;
path[pathCnt++] = 'd';
start.y += 1;
if (start.x == end.x && start.y == end.y)
{
path[pathCnt] = 0;
printf("path:%s\npathCnt:%d", path, pathCnt);
return TRUE;
}
if (start.x > 0 && maze[start.x - 1][start.y] != '1')
{
int ret = NextW(maze, start, end, path, pathCnt);
result |= ret;
}
if (start.x < end.x && maze[start.x + 1][start.y] != '1')
{
int ret = NextS(maze, start, end, path, pathCnt);
result |= ret;
}
if (start.y < end.y && maze[start.x][start.y + 1] != '1')
{
int ret = NextD(maze, start, end, path, pathCnt);
result |= ret;
}
return FALSE;
}
static BOOL NextA(const char** maze, stPOS start, stPOS end, char* path, int pathCnt)
{
BOOL result = FALSE;
path[pathCnt++] = 'a';
start.y -= 1;
if (start.x > 0 && maze[start.x - 1][start.y] != '1')
{
int ret = NextW(maze, start, end, path, pathCnt);
result |= ret;
}
if (start.x < end.x && maze[start.x + 1][start.y] != '1')
{
int ret = NextS(maze, start, end, path, pathCnt);
result |= ret;
}
if (start.y > 0 && maze[start.x][start.y - 1] != '1')
{
int ret = NextA(maze, start, end, path, pathCnt);
result |= ret;
}
return FALSE;
}
static BOOL NextS(const char** maze, stPOS start, stPOS end, char* path, int pathCnt)
{
BOOL result = FALSE;
path[pathCnt++] = 's';
start.x += 1;
if (start.x == end.x && start.y == end.y)
{
path[pathCnt] = 0;
printf("path:%s\npathCnt:%d", path, pathCnt);
return TRUE;
}
if (start.x < end.x && maze[start.x + 1][start.y] != '1')
{
int ret = NextS(maze, start, end, path, pathCnt);
result |= ret;
}
if (start.y > 0 && maze[start.x][start.y - 1] != '1')
{
int ret = NextA(maze, start, end, path, pathCnt);
result |= ret;
}
if (start.y < end.y && maze[start.x][start.y + 1] != '1')
{
int ret = NextD(maze, start, end, path, pathCnt);
result |= ret;
}
return FALSE;
}
static BOOL findPath(const char** maze, stPOS start, stPOS end, char* path, int pathCnt)
{
BOOL result = FALSE;
if (maze[start.x - 1][start.y] != '1')
{
int ret = NextW(maze, start, end, path, pathCnt);
result |= ret;
}
if (maze[start.x + 1][start.y] != '1')
{
int ret = NextS(maze, start, end, path, pathCnt);
result |= ret;
}
if (maze[start.x][start.y - 1] != '1')
{
int ret = NextA(maze, start, end, path, pathCnt);
result |= ret;
}
if (maze[start.x][start.y + 1] != '1')
{
int ret = NextD(maze, start, end, path, pathCnt);
result |= ret;
}
return 0;
}
完整代码
最后整合到main函数调用的完整代码如下:
static unsigned char __fastcall decrypt_maze(unsigned char* encryptedMaze, int realPos)
{
_BYTE Key[] = "tgrddf55";
return encryptedMaze[realPos] ^ Key[realPos % 8];
}
static unsigned char __fastcall Calc_maze(unsigned char* encryptedMaze, int row, int col)
{
return decrypt_maze(encryptedMaze, (99 * row + col) / 8) >> (7 - (99 * row + col) % 8) & 1;
}
static unsigned char __fastcall Set_maze(unsigned char* encryptedMaze, int row, int col)
{
int v4; // [rsp+1Ch] [rbp-4h]
v4 = Calc_maze(encryptedMaze, row, col);
if (!v4)
return 32;
if (v4 == 1)
return 49;
return 101;
}
unsigned char encryptedMaze[] = { 0x8b, 0x98, 0x8d, 0x9b, 0x9b, 0x99, 0xca, 0xca, 0x8b, 0x98, 0x8d, 0x9b, 0x94, 0x22, 0x74, 0x25,
0x70, 0x26, 0x76, 0x64, 0x74, 0x72, 0x35, 0x75, 0x63, 0xcc, 0xd9, 0xce, 0x9a, 0xcd, 0xdb, 0x8a,
0x8e, 0x9d, 0xcd, 0xcf, 0x9e, 0xb3, 0x20, 0x20, 0x34, 0x23, 0x62, 0x35, 0x60, 0x22, 0x61, 0x71,
0x30, 0x3d, 0xc8, 0xde, 0xcf, 0x99, 0xcf, 0xce, 0xca, 0xd9, 0xc8, 0xcf, 0x9a, 0xdd, 0x24, 0x64,
0x31, 0x26, 0x32, 0x35, 0x65, 0x72, 0x24, 0x20, 0x30, 0x36, 0x1d, 0xce, 0x8b, 0xcd, 0x9e, 0xcf,
0xcb, 0xc9, 0x99, 0x8a, 0xcf, 0xcd, 0x99, 0x70, 0x25, 0x73, 0x37, 0x25, 0x34, 0x72, 0x64, 0x74,
0x60, 0x72, 0x67, 0x8f, 0xca, 0x9c, 0xce, 0x9e, 0xdf, 0x99, 0x98, 0x9f, 0x8f, 0x8c, 0x9b, 0x84,
0x30, 0x37, 0x32, 0x71, 0x35, 0x26, 0x24, 0x74, 0x25, 0x62, 0x26, 0x32, 0x8a, 0x8c, 0xca, 0xcf,
0xdf, 0x8c, 0x8c, 0x8f, 0xce, 0x9c, 0x8f, 0xdf, 0xb0, 0x76, 0x22, 0x65, 0x75, 0x63, 0x31, 0x24,
0x30, 0x23, 0x22, 0x21, 0x7b, 0x9c, 0xdf, 0xca, 0xdf, 0x89, 0xcc, 0xde, 0x8f, 0x89, 0x8a, 0xcb,
0xcf, 0x66, 0x33, 0x34, 0x71, 0x77, 0x75, 0x61, 0x25, 0x26, 0x76, 0x64, 0x34, 0x08, 0x9b, 0xdf,
0x8e, 0x9d, 0x9d, 0xde, 0xde, 0x8c, 0xda, 0x8a, 0x9e, 0x8a, 0x66, 0x25, 0x25, 0x23, 0x64, 0x31,
0x25, 0x23, 0x33, 0x71, 0x65, 0x33, 0x9a, 0xda, 0x9b, 0xc9, 0xd8, 0x8a, 0xcf, 0x8d, 0xda, 0x9f,
0xdb, 0x8d, 0xc6, 0x61, 0x60, 0x72, 0x65, 0x71, 0x21, 0x66, 0x37, 0x71, 0x30, 0x77, 0x23, 0xcf,
0xda, 0x9c, 0xd9, 0x9e, 0x8e, 0x9d, 0xdf, 0xdf, 0xde, 0x9d, 0x8c, 0xb5, 0x30, 0x26, 0x70, 0x75,
0x35, 0x26, 0x32, 0x35, 0x30, 0x27, 0x65, 0x6f, 0xde, 0xc8, 0x88, 0x8f, 0x9b, 0x99, 0x9e, 0xdb,
0x9a, 0x99, 0x98, 0x8f, 0x71, 0x33, 0x25, 0x64, 0x30, 0x77, 0x37, 0x21, 0x71, 0x72, 0x24, 0x30,
0x0f, 0xdc, 0xd8, 0x9e, 0x8a, 0xdc, 0xde, 0x8f, 0xda, 0xc9, 0xdc, 0x9b, 0xc9, 0x77, 0x20, 0x71,
0x25, 0x76, 0x66, 0x20, 0x30, 0x23, 0x71, 0x25, 0x71, 0xdc, 0xc8, 0x8e, 0xdf, 0xc9, 0x8b, 0xce,
0xcf, 0x89, 0xd9, 0x9b, 0xcb, 0xd7, 0x65, 0x70, 0x20, 0x23, 0x63, 0x61, 0x61, 0x63, 0x20, 0x31,
0x61, 0x20, 0xd9, 0x9a, 0xde, 0xdd, 0xce, 0x9b, 0xcb, 0xd9, 0xdc, 0xdf, 0xdf, 0xcd, 0xf1, 0x24,
0x60, 0x33, 0x72, 0x21, 0x74, 0x72, 0x61, 0x24, 0x31, 0x62, 0x29, 0x9e, 0xca, 0xdc, 0xca, 0xde,
0xce, 0xdd, 0x98, 0x9b, 0xcf, 0xd9, 0x9e, 0x74, 0x65, 0x62, 0x32, 0x71, 0x70, 0x32, 0x64, 0x64,
0x70, 0x27, 0x63, 0x0f, 0xdb, 0x88, 0x9a, 0xcf, 0xce, 0xdd, 0x98, 0xce, 0xcf, 0x98, 0xcf, 0xd8,
0x65, 0x62, 0x27, 0x64, 0x20, 0x32, 0x70, 0x20, 0x21, 0x67, 0x22, 0x35, 0xdf, 0xc9, 0x9f, 0x8a,
0xcb, 0x89, 0xcc, 0xcf, 0xce, 0xd9, 0x9f, 0xce, 0xc0, 0x73, 0x63, 0x30, 0x74, 0x22, 0x74, 0x60,
0x61, 0x33, 0x76, 0x30, 0x22, 0xd8, 0xce, 0xdf, 0xcf, 0x8d, 0xdd, 0xce, 0x9e, 0xcd, 0x8a, 0xcf,
0xcf, 0xb3, 0x62, 0x65, 0x60, 0x23, 0x61, 0x60, 0x34, 0x32, 0x77, 0x64, 0x70, 0x7c, 0x9f, 0xca,
0x9b, 0x9d, 0xd8, 0x8e, 0xcb, 0x9c, 0x8a, 0x9a, 0x8a, 0x9c, 0x67, 0x74, 0x65, 0x76, 0x64, 0x64,
0x71, 0x76, 0x23, 0x75, 0x60, 0x22, 0x4b, 0xcb, 0x8b, 0x89, 0x89, 0x8a, 0x9a, 0xcc, 0x9f, 0x9b,
0x9e, 0x89, 0xce, 0x75, 0x74, 0x23, 0x24, 0x31, 0x65, 0x76, 0x67, 0x30, 0x75, 0x23, 0x24, 0x8b,
0xdb, 0xdd, 0xdc, 0xde, 0x9a, 0xc9, 0xcb, 0x9b, 0x9b, 0x89, 0xdc, 0xd0, 0x71, 0x62, 0x71, 0x64,
0x24, 0x76, 0x76, 0x75, 0x75, 0x63, 0x20, 0x23, 0x8f, 0xcc, 0xcc, 0x8e, 0xce, 0x99, 0xdb, 0x8e,
0x9a, 0x9d, 0xdc, 0xca, 0xa5, 0x63, 0x21, 0x64, 0x21, 0x37, 0x66, 0x21, 0x21, 0x66, 0x71, 0x60,
0x6a, 0xdc, 0x88, 0xce, 0x9e, 0xcd, 0xcf, 0xda, 0xda, 0xd8, 0x8d, 0x8e, 0x8b, 0x77, 0x35, 0x61,
0x25, 0x32, 0x33, 0x20, 0x20, 0x36, 0x71, 0x21, 0x34, 0x08, 0xcd, 0x9e, 0x9e, 0xdc, 0xde, 0x9e,
0x9e, 0x8c, 0xd8, 0xde, 0xdb, 0x8a, 0x74, 0x35, 0x35, 0x76, 0x33, 0x30, 0x61, 0x22, 0x31, 0x64,
0x31, 0x62, 0xc9, 0x8b, 0x9b, 0xd9, 0x9a, 0xdf, 0xcf, 0xc9, 0x9d, 0x9f, 0xcb, 0xcc, 0x81, 0x74,
0x30, 0x73, 0x62, 0x21, 0x70, 0x22, 0x64, 0x31, 0x60, 0x66, 0x24, 0xdf, 0xce, 0xdc, 0xde, 0xdf,
0xcf, 0xdc, 0x9c, 0x8a, 0x9a, 0x99, 0xdb, 0xe5, 0x30, 0x36, 0x23, 0x60, 0x35, 0x77, 0x31, 0x20,
0x30, 0x37, 0x33, 0x7f, 0x9f, 0xdd, 0xdf, 0xce, 0x8f, 0xdc, 0xcc, 0xda, 0xca, 0xcd, 0xde, 0x9a,
0x65, 0x26, 0x37, 0x65, 0x25, 0x62, 0x24, 0x21, 0x60, 0x22, 0x33, 0x21, 0x1a, 0xc9, 0x9f, 0x8a,
0xcf, 0xd8, 0x89, 0xca, 0x8a, 0x89, 0x9e, 0xda, 0xd8, 0x32, 0x66, 0x24, 0x20, 0x36, 0x74, 0x60,
0x74, 0x26, 0x67, 0x60, 0x61, 0xcc, 0x9f, 0xda, 0x9f, 0xdd, 0x99, 0xce, 0xdb, 0x89, 0x9f, 0x8b,
0x8b, 0xd3, 0x37, 0x21, 0x65, 0x66, 0x70, 0x64, 0x65, 0x63, 0x33, 0x34, 0x25, 0x60, 0xca, 0x9b,
0xdb, 0x88, 0x8c, 0x8f, 0x9f, 0xd8, 0xda, 0x8e, 0x9f, 0x89, 0xb3, 0x60, 0x71, 0x62, 0x31, 0x71,
0x34, 0x73, 0x32, 0x70, 0x21, 0x27, 0x2a, 0x8a, 0x8a, 0x89, 0x8c, 0xda, 0xca, 0xd8, 0x9a, 0xcb,
0xce, 0xcc, 0x89, 0x70, 0x64, 0x77, 0x25, 0x71, 0x60, 0x33, 0x66, 0x74, 0x74, 0x33, 0x31, 0x5f,
0xcb, 0x89, 0x9c, 0xdf, 0xdb, 0x8c, 0x8b, 0x8f, 0x8f, 0x8d, 0xcc, 0xd9, 0x30, 0x72, 0x64, 0x61,
0x25, 0x62, 0x26, 0x75, 0x25, 0x77, 0x65, 0x24, 0xce, 0xdd, 0x98, 0x8e, 0xde, 0xc8, 0x8f, 0x8a,
0x9b, 0xd9, 0x89, 0x9b, 0xd5, 0x22, 0x64, 0x70, 0x34, 0x33, 0x32, 0x20, 0x60, 0x62, 0x25, 0x75,
0x72, 0xc8, 0xc8, 0x8a, 0xcb, 0x9d, 0xda, 0xce, 0xce, 0x98, 0xc8, 0x9f, 0x9a, 0xb3, 0x31, 0x24,
0x70, 0x27, 0x32, 0x25, 0x75, 0x26, 0x31, 0x65, 0x30, 0x3d, 0xdd, 0x9a, 0x9a, 0x8d, 0xde, 0x8e,
0xca, 0xc8, 0x8c, 0x9f, 0xde, 0xdd, 0x70, 0x35, 0x34, 0x22, 0x63, 0x70, 0x34, 0x33, 0x30, 0x25,
0x30, 0x33, 0x1d, 0xcb, 0xdb, 0xd8, 0xce, 0x8f, 0xcf, 0x89, 0xdc, 0xca, 0x9f, 0xdc, 0x88, 0x24,
0x64, 0x77, 0x32, 0x20, 0x30, 0x22, 0x21, 0x64, 0x24, 0x33, 0x27, 0xce, 0x8e, 0x99, 0xda, 0xce,
0xca, 0xcd, 0x8d, 0xde, 0x8e, 0x9c, 0x8f, 0x80, 0x35, 0x27, 0x76, 0x75, 0x20, 0x73, 0x71, 0x31,
0x25, 0x26, 0x63, 0x72, 0xdb, 0x88, 0x8b, 0xcf, 0xcf, 0xd8, 0xd9, 0xdb, 0xce, 0xcd, 0x8b, 0xdb,
0xa4, 0x66, 0x66, 0x21, 0x74, 0x22, 0x24, 0x34, 0x61, 0x72, 0x26, 0x20, 0x3f, 0xd9, 0xca, 0x9b,
0xcb, 0x9c, 0xc9, 0xdb, 0x8e, 0xc8, 0x9f, 0x9b, 0x9f, 0x73, 0x66, 0x20, 0x70, 0x67, 0x30, 0x25,
0x25, 0x32, 0x66, 0x30, 0x61, 0x1c, 0x8f, 0x9e, 0x9a, 0xd9, 0xcd, 0xdf, 0x8e, 0x8d, 0x9b, 0xcf,
0xcb, 0xcb, 0x36, 0x30, 0x25, 0x66, 0x61, 0x34, 0x61, 0x32, 0x76, 0x24, 0x30, 0x63, 0x8a, 0xdf,
0x8f, 0x98, 0x89, 0xdb, 0xde, 0xcc, 0x8a, 0xca, 0x8f, 0xd8, 0xc2, 0x60, 0x30, 0x26, 0x31, 0x75,
0x65, 0x26, 0x62, 0x74, 0x60, 0x62, 0x32, 0xcb, 0x9e, 0xdd, 0x8c, 0xdf, 0x9f, 0xc8, 0xce, 0xcf,
0x8a, 0xd8, 0xcd, 0xa4, 0x75, 0x22, 0x64, 0x24, 0x35, 0x22, 0x63, 0x25, 0x34, 0x76, 0x24, 0x2e,
0x8a, 0x89, 0x88, 0xcb, 0xcf, 0xdd, 0x8b, 0x9a, 0xde, 0x9c, 0x88, 0xcf, 0x74, 0x22, 0x75, 0x61,
0x65, 0x76, 0x62, 0x71, 0x60, 0x22, 0x74, 0x24, 0x0e, 0x98, 0x9d, 0x9a, 0x9f, 0x9d, 0x8e, 0xcb,
0xdb, 0x99, 0x98, 0x9a, 0x99, 0x76, 0x24, 0x35, 0x24, 0x26, 0x62, 0x70, 0x20, 0x27, 0x30, 0x65,
0x65, 0xdd, 0x88, 0x9b, 0xce, 0x9c, 0x8e, 0xcf, 0xdb, 0x8c, 0xcc, 0xde, 0x9a, 0xd7, 0x74, 0x25,
0x60, 0x37, 0x22, 0x34, 0x20, 0x67, 0x61, 0x65, 0x31, 0x70, 0xd9, 0xda, 0x9e, 0x8d, 0xce, 0xcf,
0x8b, 0x9c, 0x98, 0xcf, 0x9a, 0xc8, 0xf0, 0x71, 0x24, 0x76, 0x63, 0x60, 0x30, 0x67, 0x74, 0x21,
0x34, 0x32, 0x68, 0xdf, 0x8e, 0x98, 0xcf, 0x8b, 0x9e, 0xdc, 0xd9, 0x8a, 0x8f, 0x8c, 0x9a, 0x61,
0x34, 0x37, 0x23, 0x35, 0x61, 0x27, 0x60, 0x25, 0x65, 0x23, 0x36, 0x1e, 0xdf, 0x98, 0xdb, 0x9f,
0xca, 0xc8, 0x98, 0xdf, 0x9a, 0x88, 0xca, 0xd9, 0x35, 0x66, 0x66, 0x75, 0x30, 0x73, 0x34, 0x74,
0x34, 0x22, 0x72, 0x61, 0xdb, 0x89, 0x9f, 0xca, 0x9e, 0xd9, 0xc9, 0x8b, 0xce, 0x89, 0x9a, 0xcb,
0xc4, 0x67, 0x63, 0x64, 0x65, 0x22, 0x35, 0x31, 0x70, 0x23, 0x73, 0x64, 0x63, 0x99, 0xca, 0xca,
0x8b, 0x98, 0x8d, 0x9b, 0x9b, 0x99, 0xca, 0xca, 0x8b, 0xe7
};
_DWORD rowMask[] = { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0 };
_DWORD colMask[] = { 0xFFFFFFFF, 0, 1, 0, 0xFFFFFFFF, 0, 1, 0, 0xFFFFFFFF, 0, 1, 0, 0, 0, 0, 0 };
static char* __fastcall Init_maze(char** maze, int row, int col)
{
int i; // [rsp+14h] [rbp-3Ch]
int j; // [rsp+18h] [rbp-38h]
int k; // [rsp+1Ch] [rbp-34h]
for (i = 0; i <= 2; ++i)
maze[row - 1][col - 1 + i] = Set_maze(encryptedMaze, rowMask[i] + row, colMask[i] + col);
for (j = 4; j <= 6; ++j)
maze[row][col - 1 + j - 4] = Set_maze(encryptedMaze, rowMask[j] + row, colMask[j] + col);
for (k = 8; k <= 10 ; ++k)
maze[row + 1][col - 1 + k - 8] = Set_maze(encryptedMaze, rowMask[k] + row, colMask[k] + col);
return 0;
}
typedef struct _stPOS
{
int x;
int y;
} stPOS;
static BOOL NextW(const char** maze, stPOS start, stPOS end, char* path, int pathCnt);
static BOOL NextA(const char** maze, stPOS start, stPOS end, char* path, int pathCnt);
static BOOL NextS(const char** maze, stPOS start, stPOS end, char* path, int pathCnt);
static BOOL NextD(const char** maze, stPOS start, stPOS end, char* path, int pathCnt);
static BOOL NextW(const char** maze, stPOS start, stPOS end, char* path, int pathCnt)
{
BOOL result = FALSE;
path[pathCnt++] = 'w';
start.x -= 1;
if (start.x > 0 && maze[start.x - 1][start.y] != '1')
{
int ret = NextW(maze, start, end, path, pathCnt);
result |= ret;
}
if (start.y > 0 && maze[start.x][start.y - 1] != '1')
{
int ret = NextA(maze, start, end, path, pathCnt);
result |= ret;
}
if (start.y < end.y && maze[start.x][start.y + 1] != '1')
{
int ret = NextD(maze, start, end, path, pathCnt);
result |= ret;
}
return FALSE;
}
static BOOL NextD(const char** maze, stPOS start, stPOS end, char* path, int pathCnt)
{
BOOL result = FALSE;
path[pathCnt++] = 'd';
start.y += 1;
if (start.x == end.x && start.y == end.y)
{
path[pathCnt] = 0;
printf("path:%s\npathCnt:%d", path, pathCnt);
return TRUE;
}
if (start.x > 0 && maze[start.x - 1][start.y] != '1')
{
int ret = NextW(maze, start, end, path, pathCnt);
result |= ret;
}
if (start.x < end.x && maze[start.x + 1][start.y] != '1')
{
int ret = NextS(maze, start, end, path, pathCnt);
result |= ret;
}
if (start.y < end.y && maze[start.x][start.y + 1] != '1')
{
int ret = NextD(maze, start, end, path, pathCnt);
result |= ret;
}
return FALSE;
}
static BOOL NextA(const char** maze, stPOS start, stPOS end, char* path, int pathCnt)
{
BOOL result = FALSE;
path[pathCnt++] = 'a';
start.y -= 1;
if (start.x > 0 && maze[start.x - 1][start.y] != '1')
{
int ret = NextW(maze, start, end, path, pathCnt);
result |= ret;
}
if (start.x < end.x && maze[start.x + 1][start.y] != '1')
{
int ret = NextS(maze, start, end, path, pathCnt);
result |= ret;
}
if (start.y > 0 && maze[start.x][start.y - 1] != '1')
{
int ret = NextA(maze, start, end, path, pathCnt);
result |= ret;
}
return FALSE;
}
static BOOL NextS(const char** maze, stPOS start, stPOS end, char* path, int pathCnt)
{
BOOL result = FALSE;
path[pathCnt++] = 's';
start.x += 1;
if (start.x == end.x && start.y == end.y)
{
path[pathCnt] = 0;
printf("path:%s\npathCnt:%d", path, pathCnt);
return TRUE;
}
if (start.x < end.x && maze[start.x + 1][start.y] != '1')
{
int ret = NextS(maze, start, end, path, pathCnt);
result |= ret;
}
if (start.y > 0 && maze[start.x][start.y - 1] != '1')
{
int ret = NextA(maze, start, end, path, pathCnt);
result |= ret;
}
if (start.y < end.y && maze[start.x][start.y + 1] != '1')
{
int ret = NextD(maze, start, end, path, pathCnt);
result |= ret;
}
return FALSE;
}
static BOOL findPath(const char** maze, stPOS start, stPOS end, char* path, int pathCnt)
{
BOOL result = FALSE;
if (maze[start.x - 1][start.y] != '1')
{
int ret = NextW(maze, start, end, path, pathCnt);
result |= ret;
}
if (maze[start.x + 1][start.y] != '1')
{
int ret = NextS(maze, start, end, path, pathCnt);
result |= ret;
}
if (maze[start.x][start.y - 1] != '1')
{
int ret = NextA(maze, start, end, path, pathCnt);
result |= ret;
}
if (maze[start.x][start.y + 1] != '1')
{
int ret = NextD(maze, start, end, path, pathCnt);
result |= ret;
}
return 0;
}
int main(void)
{
system("chcp 65001");
char ** maze = (char**)malloc(99 * sizeof(char*));
if (maze)
{
memset(maze, 0, 99 * sizeof(char*));
for (int i = 0; i < 99; i++)
{
maze[i] = (char*)malloc(100);
if (maze[i])
{
memset(maze[i], 48, 100);
maze[i][99] = 0;
}
}
for (int i = 1; i < 99; i = i + 3)
{
for (int j = 1; j < 99; j = j + 3)
{
Init_maze(maze, i, j);
}
}
for (int i = 0; i < 99; i++)
printf("%s\n", maze[i]);
stPOS start = { 1, 1 };
stPOS end = { 97, 97 };
char path[97 * 97 + 1] = { 0 };
int pathCnt = 0;
findPath((const char**)maze, start, end, path, 0);
for (int i = 0; i < 99; i++)
{
if (maze[i])
{
free(maze[i]);
maze[i] = NULL;
}
}
free(maze);
maze = NULL;
}
return 0;
}
Python代码
另附一份python代码
import hashlib
import sys
# 加密的迷宫数据
encrypted_maze = [
0x8b, 0x98, 0x8d, 0x9b, 0x9b, 0x99, 0xca, 0xca, 0x8b, 0x98, 0x8d, 0x9b, 0x94, 0x22, 0x74, 0x25,
0x70, 0x26, 0x76, 0x64, 0x74, 0x72, 0x35, 0x75, 0x63, 0xcc, 0xd9, 0xce, 0x9a, 0xcd, 0xdb, 0x8a,
0x8e, 0x9d, 0xcd, 0xcf, 0x9e, 0xb3, 0x20, 0x20, 0x34, 0x23, 0x62, 0x35, 0x60, 0x22, 0x61, 0x71,
0x30, 0x3d, 0xc8, 0xde, 0xcf, 0x99, 0xcf, 0xce, 0xca, 0xd9, 0xc8, 0xcf, 0x9a, 0xdd, 0x24, 0x64,
0x31, 0x26, 0x32, 0x35, 0x65, 0x72, 0x24, 0x20, 0x30, 0x36, 0x1d, 0xce, 0x8b, 0xcd, 0x9e, 0xcf,
0xcb, 0xc9, 0x99, 0x8a, 0xcf, 0xcd, 0x99, 0x70, 0x25, 0x73, 0x37, 0x25, 0x34, 0x72, 0x64, 0x74,
0x60, 0x72, 0x67, 0x8f, 0xca, 0x9c, 0xce, 0x9e, 0xdf, 0x99, 0x98, 0x9f, 0x8f, 0x8c, 0x9b, 0x84,
0x30, 0x37, 0x32, 0x71, 0x35, 0x26, 0x24, 0x74, 0x25, 0x62, 0x26, 0x32, 0x8a, 0x8c, 0xca, 0xcf,
0xdf, 0x8c, 0x8c, 0x8f, 0xce, 0x9c, 0x8f, 0xdf, 0xb0, 0x76, 0x22, 0x65, 0x75, 0x63, 0x31, 0x24,
0x30, 0x23, 0x22, 0x21, 0x7b, 0x9c, 0xdf, 0xca, 0xdf, 0x89, 0xcc, 0xde, 0x8f, 0x89, 0x8a, 0xcb,
0xcf, 0x66, 0x33, 0x34, 0x71, 0x77, 0x75, 0x61, 0x25, 0x26, 0x76, 0x64, 0x34, 0x08, 0x9b, 0xdf,
0x8e, 0x9d, 0x9d, 0xde, 0xde, 0x8c, 0xda, 0x8a, 0x9e, 0x8a, 0x66, 0x25, 0x25, 0x23, 0x64, 0x31,
0x25, 0x23, 0x33, 0x71, 0x65, 0x33, 0x9a, 0xda, 0x9b, 0xc9, 0xd8, 0x8a, 0xcf, 0x8d, 0xda, 0x9f,
0xdb, 0x8d, 0xc6, 0x61, 0x60, 0x72, 0x65, 0x71, 0x21, 0x66, 0x37, 0x71, 0x30, 0x77, 0x23, 0xcf,
0xda, 0x9c, 0xd9, 0x9e, 0x8e, 0x9d, 0xdf, 0xdf, 0xde, 0x9d, 0x8c, 0xb5, 0x30, 0x26, 0x70, 0x75,
0x35, 0x26, 0x32, 0x35, 0x30, 0x27, 0x65, 0x6f, 0xde, 0xc8, 0x88, 0x8f, 0x9b, 0x99, 0x9e, 0xdb,
0x9a, 0x99, 0x98, 0x8f, 0x71, 0x33, 0x25, 0x64, 0x30, 0x77, 0x37, 0x21, 0x71, 0x72, 0x24, 0x30,
0x0f, 0xdc, 0xd8, 0x9e, 0x8a, 0xdc, 0xde, 0x8f, 0xda, 0xc9, 0xdc, 0x9b, 0xc9, 0x77, 0x20, 0x71,
0x25, 0x76, 0x66, 0x20, 0x30, 0x23, 0x71, 0x25, 0x71, 0xdc, 0xc8, 0x8e, 0xdf, 0xc9, 0x8b, 0xce,
0xcf, 0x89, 0xd9, 0x9b, 0xcb, 0xd7, 0x65, 0x70, 0x20, 0x23, 0x63, 0x61, 0x61, 0x63, 0x20, 0x31,
0x61, 0x20, 0xd9, 0x9a, 0xde, 0xdd, 0xce, 0x9b, 0xcb, 0xd9, 0xdc, 0xdf, 0xdf, 0xcd, 0xf1, 0x24,
0x60, 0x33, 0x72, 0x21, 0x74, 0x72, 0x61, 0x24, 0x31, 0x62, 0x29, 0x9e, 0xca, 0xdc, 0xca, 0xde,
0xce, 0xdd, 0x98, 0x9b, 0xcf, 0xd9, 0x9e, 0x74, 0x65, 0x62, 0x32, 0x71, 0x70, 0x32, 0x64, 0x64,
0x70, 0x27, 0x63, 0x0f, 0xdb, 0x88, 0x9a, 0xcf, 0xce, 0xdd, 0x98, 0xce, 0xcf, 0x98, 0xcf, 0xd8,
0x65, 0x62, 0x27, 0x64, 0x20, 0x32, 0x70, 0x20, 0x21, 0x67, 0x22, 0x35, 0xdf, 0xc9, 0x9f, 0x8a,
0xcb, 0x89, 0xcc, 0xcf, 0xce, 0xd9, 0x9f, 0xce, 0xc0, 0x73, 0x63, 0x30, 0x74, 0x22, 0x74, 0x60,
0x61, 0x33, 0x76, 0x30, 0x22, 0xd8, 0xce, 0xdf, 0xcf, 0x8d, 0xdd, 0xce, 0x9e, 0xcd, 0x8a, 0xcf,
0xcf, 0xb3, 0x62, 0x65, 0x60, 0x23, 0x61, 0x60, 0x34, 0x32, 0x77, 0x64, 0x70, 0x7c, 0x9f, 0xca,
0x9b, 0x9d, 0xd8, 0x8e, 0xcb, 0x9c, 0x8a, 0x9a, 0x8a, 0x9c, 0x67, 0x74, 0x65, 0x76, 0x64, 0x64,
0x71, 0x76, 0x23, 0x75, 0x60, 0x22, 0x4b, 0xcb, 0x8b, 0x89, 0x89, 0x8a, 0x9a, 0xcc, 0x9f, 0x9b,
0x9e, 0x89, 0xce, 0x75, 0x74, 0x23, 0x24, 0x31, 0x65, 0x76, 0x67, 0x30, 0x75, 0x23, 0x24, 0x8b,
0xdb, 0xdd, 0xdc, 0xde, 0x9a, 0xc9, 0xcb, 0x9b, 0x9b, 0x89, 0xdc, 0xd0, 0x71, 0x62, 0x71, 0x64,
0x24, 0x76, 0x76, 0x75, 0x75, 0x63, 0x20, 0x23, 0x8f, 0xcc, 0xcc, 0x8e, 0xce, 0x99, 0xdb, 0x8e,
0x9a, 0x9d, 0xdc, 0xca, 0xa5, 0x63, 0x21, 0x64, 0x21, 0x37, 0x66, 0x21, 0x21, 0x66, 0x71, 0x60,
0x6a, 0xdc, 0x88, 0xce, 0x9e, 0xcd, 0xcf, 0xda, 0xda, 0xd8, 0x8d, 0x8e, 0x8b, 0x77, 0x35, 0x61,
0x25, 0x32, 0x33, 0x20, 0x20, 0x36, 0x71, 0x21, 0x34, 0x08, 0xcd, 0x9e, 0x9e, 0xdc, 0xde, 0x9e,
0x9e, 0x8c, 0xd8, 0xde, 0xdb, 0x8a, 0x74, 0x35, 0x35, 0x76, 0x33, 0x30, 0x61, 0x22, 0x31, 0x64,
0x31, 0x62, 0xc9, 0x8b, 0x9b, 0xd9, 0x9a, 0xdf, 0xcf, 0xc9, 0x9d, 0x9f, 0xcb, 0xcc, 0x81, 0x74,
0x30, 0x73, 0x62, 0x21, 0x70, 0x22, 0x64, 0x31, 0x60, 0x66, 0x24, 0xdf, 0xce, 0xdc, 0xde, 0xdf,
0xcf, 0xdc, 0x9c, 0x8a, 0x9a, 0x99, 0xdb, 0xe5, 0x30, 0x36, 0x23, 0x60, 0x35, 0x77, 0x31, 0x20,
0x30, 0x37, 0x33, 0x7f, 0x9f, 0xdd, 0xdf, 0xce, 0x8f, 0xdc, 0xcc, 0xda, 0xca, 0xcd, 0xde, 0x9a,
0x65, 0x26, 0x37, 0x65, 0x25, 0x62, 0x24, 0x21, 0x60, 0x22, 0x33, 0x21, 0x1a, 0xc9, 0x9f, 0x8a,
0xcf, 0xd8, 0x89, 0xca, 0x8a, 0x89, 0x9e, 0xda, 0xd8, 0x32, 0x66, 0x24, 0x20, 0x36, 0x74, 0x60,
0x74, 0x26, 0x67, 0x60, 0x61, 0xcc, 0x9f, 0xda, 0x9f, 0xdd, 0x99, 0xce, 0xdb, 0x89, 0x9f, 0x8b,
0x8b, 0xd3, 0x37, 0x21, 0x65, 0x66, 0x70, 0x64, 0x65, 0x63, 0x33, 0x34, 0x25, 0x60, 0xca, 0x9b,
0xdb, 0x88, 0x8c, 0x8f, 0x9f, 0xd8, 0xda, 0x8e, 0x9f, 0x89, 0xb3, 0x60, 0x71, 0x62, 0x31, 0x71,
0x34, 0x73, 0x32, 0x70, 0x21, 0x27, 0x2a, 0x8a, 0x8a, 0x89, 0x8c, 0xda, 0xca, 0xd8, 0x9a, 0xcb,
0xce, 0xcc, 0x89, 0x70, 0x64, 0x77, 0x25, 0x71, 0x60, 0x33, 0x66, 0x74, 0x74, 0x33, 0x31, 0x5f,
0xcb, 0x89, 0x9c, 0xdf, 0xdb, 0x8c, 0x8b, 0x8f, 0x8f, 0x8d, 0xcc, 0xd9, 0x30, 0x72, 0x64, 0x61,
0x25, 0x62, 0x26, 0x75, 0x25, 0x77, 0x65, 0x24, 0xce, 0xdd, 0x98, 0x8e, 0xde, 0xc8, 0x8f, 0x8a,
0x9b, 0xd9, 0x89, 0x9b, 0xd5, 0x22, 0x64, 0x70, 0x34, 0x33, 0x32, 0x20, 0x60, 0x62, 0x25, 0x75,
0x72, 0xc8, 0xc8, 0x8a, 0xcb, 0x9d, 0xda, 0xce, 0xce, 0x98, 0xc8, 0x9f, 0x9a, 0xb3, 0x31, 0x24,
0x70, 0x27, 0x32, 0x25, 0x75, 0x26, 0x31, 0x65, 0x30, 0x3d, 0xdd, 0x9a, 0x9a, 0x8d, 0xde, 0x8e,
0xca, 0xc8, 0x8c, 0x9f, 0xde, 0xdd, 0x70, 0x35, 0x34, 0x22, 0x63, 0x70, 0x34, 0x33, 0x30, 0x25,
0x30, 0x33, 0x1d, 0xcb, 0xdb, 0xd8, 0xce, 0x8f, 0xcf, 0x89, 0xdc, 0xca, 0x9f, 0xdc, 0x88, 0x24,
0x64, 0x77, 0x32, 0x20, 0x30, 0x22, 0x21, 0x64, 0x24, 0x33, 0x27, 0xce, 0x8e, 0x99, 0xda, 0xce,
0xca, 0xcd, 0x8d, 0xde, 0x8e, 0x9c, 0x8f, 0x80, 0x35, 0x27, 0x76, 0x75, 0x20, 0x73, 0x71, 0x31,
0x25, 0x26, 0x63, 0x72, 0xdb, 0x88, 0x8b, 0xcf, 0xcf, 0xd8, 0xd9, 0xdb, 0xce, 0xcd, 0x8b, 0xdb,
0xa4, 0x66, 0x66, 0x21, 0x74, 0x22, 0x24, 0x34, 0x61, 0x72, 0x26, 0x20, 0x3f, 0xd9, 0xca, 0x9b,
0xcb, 0x9c, 0xc9, 0xdb, 0x8e, 0xc8, 0x9f, 0x9b, 0x9f, 0x73, 0x66, 0x20, 0x70, 0x67, 0x30, 0x25,
0x25, 0x32, 0x66, 0x30, 0x61, 0x1c, 0x8f, 0x9e, 0x9a, 0xd9, 0xcd, 0xdf, 0x8e, 0x8d, 0x9b, 0xcf,
0xcb, 0xcb, 0x36, 0x30, 0x25, 0x66, 0x61, 0x34, 0x61, 0x32, 0x76, 0x24, 0x30, 0x63, 0x8a, 0xdf,
0x8f, 0x98, 0x89, 0xdb, 0xde, 0xcc, 0x8a, 0xca, 0x8f, 0xd8, 0xc2, 0x60, 0x30, 0x26, 0x31, 0x75,
0x65, 0x26, 0x62, 0x74, 0x60, 0x62, 0x32, 0xcb, 0x9e, 0xdd, 0x8c, 0xdf, 0x9f, 0xc8, 0xce, 0xcf,
0x8a, 0xd8, 0xcd, 0xa4, 0x75, 0x22, 0x64, 0x24, 0x35, 0x22, 0x63, 0x25, 0x34, 0x76, 0x24, 0x2e,
0x8a, 0x89, 0x88, 0xcb, 0xcf, 0xdd, 0x8b, 0x9a, 0xde, 0x9c, 0x88, 0xcf, 0x74, 0x22, 0x75, 0x61,
0x65, 0x76, 0x62, 0x71, 0x60, 0x22, 0x74, 0x24, 0x0e, 0x98, 0x9d, 0x9a, 0x9f, 0x9d, 0x8e, 0xcb,
0xdb, 0x99, 0x98, 0x9a, 0x99, 0x76, 0x24, 0x35, 0x24, 0x26, 0x62, 0x70, 0x20, 0x27, 0x30, 0x65,
0x65, 0xdd, 0x88, 0x9b, 0xce, 0x9c, 0x8e, 0xcf, 0xdb, 0x8c, 0xcc, 0xde, 0x9a, 0xd7, 0x74, 0x25,
0x60, 0x37, 0x22, 0x34, 0x20, 0x67, 0x61, 0x65, 0x31, 0x70, 0xd9, 0xda, 0x9e, 0x8d, 0xce, 0xcf,
0x8b, 0x9c, 0x98, 0xcf, 0x9a, 0xc8, 0xf0, 0x71, 0x24, 0x76, 0x63, 0x60, 0x30, 0x67, 0x74, 0x21,
0x34, 0x32, 0x68, 0xdf, 0x8e, 0x98, 0xcf, 0x8b, 0x9e, 0xdc, 0xd9, 0x8a, 0x8f, 0x8c, 0x9a, 0x61,
0x34, 0x37, 0x23, 0x35, 0x61, 0x27, 0x60, 0x25, 0x65, 0x23, 0x36, 0x1e, 0xdf, 0x98, 0xdb, 0x9f,
0xca, 0xc8, 0x98, 0xdf, 0x9a, 0x88, 0xca, 0xd9, 0x35, 0x66, 0x66, 0x75, 0x30, 0x73, 0x34, 0x74,
0x34, 0x22, 0x72, 0x61, 0xdb, 0x89, 0x9f, 0xca, 0x9e, 0xd9, 0xc9, 0x8b, 0xce, 0x89, 0x9a, 0xcb,
0xc4, 0x67, 0x63, 0x64, 0x65, 0x22, 0x35, 0x31, 0x70, 0x23, 0x73, 0x64, 0x63, 0x99, 0xca, 0xca,
0x8b, 0x98, 0x8d, 0x9b, 0x9b, 0x99, 0xca, 0xca, 0x8b, 0xe7
]
# 行和列的掩码
row_mask = [0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0]
col_mask = [0xFFFFFFFF, 0, 1, 0, 0xFFFFFFFF, 0, 1, 0, 0xFFFFFFFF, 0, 1, 0, 0, 0, 0, 0]
def decrypt_maze(encrypted_maze, real_pos):
"""解密迷宫数据"""
key = "tgrddf55"
return encrypted_maze[real_pos] ^ ord(key[real_pos % 8])
def calc_maze(encrypted_maze, row, col):
"""计算迷宫位置的值"""
pos = (99 * row + col) // 8
bit_index = (99 * row + col) % 8
decrypted_byte = decrypt_maze(encrypted_maze, pos)
return (decrypted_byte >> (7 - bit_index)) & 1
def set_maze(encrypted_maze, row, col):
"""根据计算结果设置迷宫字符"""
val = calc_maze(encrypted_maze, row, col)
if val == 0:
return ' '
elif val == 1:
return '1'
else:
return 'e'
def init_maze(maze, row, col):
"""初始化迷宫区域"""
# 第一行 (row-1)
for i in range(3):
maze[row - 1][col - 1 + i] = set_maze(encrypted_maze, (row_mask[i] + row) & 0xFFFFFFFF, (col_mask[i] + col) & 0xFFFFFFFF)
# 第二行 (row)
for j in range(4, 7):
maze[row][col - 1 + j - 4] = set_maze(encrypted_maze, (row_mask[j] + row) & 0xFFFFFFFF, (col_mask[j] + col) & 0xFFFFFFFF)
# 第三行 (row+1)
for k in range(8, 11):
maze[row + 1][col - 1 + k - 8] = set_maze(encrypted_maze, (row_mask[k] + row) & 0xFFFFFFFF, (col_mask[k] + col) & 0xFFFFFFFF)
def next_w(maze, startX, startY, endX, endY, path, path_cnt):
"""向上移动 (W)"""
path[path_cnt] = 'w'
path_str = ''.join(path)
path_cnt += 1
startX -= 1
result = False
if startX > 0 and maze[startX - 1][startY] != '1':
result |= next_w(maze, startX, startY, endX, endY, path, path_cnt)
if startY > 0 and maze[startX][startY - 1] != '1':
result |= next_a(maze, startX, startY, endX, endY, path, path_cnt)
if startY < endY and maze[startX][startY + 1] != '1':
result |= next_d(maze, startX, startY, endX, endY, path, path_cnt)
if not result:
path[path_cnt] = ''
return result
def next_d(maze, startX, startY, endX, endY, path, path_cnt):
"""向右移动 (D)"""
path[path_cnt] = 'd'
path_str = ''.join(path)
path_cnt += 1
startY += 1
if startX == endX and startY == endY:
path_str = ''.join(path)
print(f"success path:{path_str}\npathCnt:{path_cnt}")
print("flag{" + hashlib.md5(''.join(path).encode()).hexdigest() + "}")
return True
result = False
if startX > 0 and maze[startX - 1][startY] != '1':
result |= next_w(maze, startX, startY, endX, endY, path, path_cnt)
if startX < endX and maze[startX + 1][startY] != '1':
result |= next_s(maze, startX, startY, endX, endY, path, path_cnt)
if startY < endY and maze[startX][startY + 1] != '1':
result |= next_d(maze, startX, startY, endX, endY, path, path_cnt)
if not result:
path[path_cnt] = ''
return result
def next_a(maze, startX, startY, endX, endY, path, path_cnt):
"""向左移动 (A)"""
path[path_cnt] = 'a'
path_str = ''.join(path)
path_cnt += 1
startY -= 1
result = False
if startX > 0 and maze[startX - 1][startY] != '1':
result |= next_w(maze, startX, startY, endX, endY, path, path_cnt)
if startX < endX and maze[startX + 1][startY] != '1':
result |= next_s(maze, startX, startY, endX, endY, path, path_cnt)
if startY > 0 and maze[startX][startY - 1] != '1':
result |= next_a(maze, startX, startY, endX, endY, path, path_cnt)
if not result:
path[path_cnt] = ''
return result
def next_s(maze, startX, startY, endX, endY, path, path_cnt):
"""向下移动 (S)"""
path[path_cnt] = 's'
path_str = ''.join(path)
path_cnt += 1
startX += 1
if startX == endX and startY == endY:
path_str = ''.join(path)
print(f"success path:{path_str}\npathCnt:{path_cnt}")
print("flag:{" + hashlib.md5(''.join(path).encode()).hexdigest() + "}")
return True
result = False
if startX < endX and maze[startX + 1][startY] != '1':
result |= next_s(maze, startX, startY, endX, endY, path, path_cnt)
if startY > 0 and maze[startX][startY - 1] != '1':
result |= next_a(maze, startX, startY, endX, endY, path, path_cnt)
if startY < endY and maze[startX][startY + 1] != '1':
result |= next_d(maze, startX, startY, endX, endY, path, path_cnt)
if not result:
path[path_cnt] = ''
return result
def find_path(maze, startX, startY, endX, endY, path, path_cnt):
"""寻找迷宫路径"""
result = False
if maze[startX - 1][startY] != '1':
result |= next_w(maze, startX, startY, endX, endY, path, path_cnt)
if maze[startX + 1][startY] != '1':
result |= next_s(maze, startX, startY, endX, endY, path, path_cnt)
if maze[startX][startY - 1] != '1':
result |= next_a(maze, startX, startY, endX, endY, path, path_cnt)
if maze[startX][startY + 1] != '1':
result |= next_d(maze, startX, startY, endX, endY, path, path_cnt)
if not result:
path[path_cnt] = ''
return result
def main():
"""主函数"""
# 创建99x100的迷宫
maze = [['0' for _ in range(100)] for _ in range(99)]
# 初始化迷宫
for i in range(1, 99, 3):
for j in range(1, 99, 3):
init_maze(maze, i, j)
# 打印迷宫
for i in range(99):
print(''.join(maze[i][:99])) # 只打印前99列
# 寻找路径
startX = 1
startY = 1
endX = 97
endY = 97
path = [''] * 10000 # 假设路径长度不会超过1000
find_path(maze, startX, startY, endX, endY, path, 0)
if __name__ == "__main__":
print(f"{sys.getrecursionlimit()}")
sys.setrecursionlimit(10 ** 5)
print(f"{sys.getrecursionlimit()}")
main()