从迷宫到回溯递归算法
CTF中经常有一些需要单字符或者双字符等情况的爆破问题
在这类问题中,通过输入给定字符集$\alpha$中的元素,给程序黑盒进行黑盒测试,判断输出从而得到某些字符组合的可行性进而得出最后结果。这种方式不需要手写代码,而是直接借程序检查,写起来很方便。从另一个角度说,这一类型的题不要求理解代码逻辑,而是要求理解程序意义,即:看到检查九宫格可以联想到数独,看到wasd可以联想到迷宫。
因此,这里从迷宫外推到相关算法,尝试给出固定解题模板。
迷宫1
现在有一个二维迷宫,其中每个格子都是正六边形,已知起点和终点格id。字符集$\alpha = {a,b,c,d,e,f}$ 分别表示不同的方向,go方法接受字符集$\alpha$元素的组合(字符串),然后尝试从起点进行移动,每次移动时全部移动成功返回0,某步移动失败直接返回-1,某步到达终点直接返回1。要求得出最短路径。
迷宫2
现在有一个链表Maze,每个节点结构为:
1 | typedef struct Node{ |
a,b,c均可为0,也可以为任意节点,包括自己和0,0表示死路。$\alpha = {a,b,c}$ 分别表示当前位置选择的路径,该Maze类有move方法,接受一个字符串格式的$\alpha$元素,返回在当前位置移动后下一个节点的地址。移动失败返回-1。已知起始地址和结束地址和要求的长度,解出和要求长度相等的路径。
迷宫3
现有一个二维迷宫,每个格子都是正方型,向一个方向移动时不会自动停止,只会在前方有障碍时停止,尝试得出该迷宫的路径。
数独1
给定一个数独题目和一个哈希,该哈希是数独的一个解中所有数字拼接成的字符串。尝试通过这个哈希找到该字符串。
数独2
给定一个数独题目,将整个数独划分为5个方环,将这个数独题目解出后的分数表示为每个当前格的数字乘方环系数之和。方环系数从中心到最外侧分别为10,9,8,7,6。现在随机生成一个数独题目,求该题目的最大分数的解。
多字符校验1
每4位进行校验,比如字符串abcde,先校验abcd然后校验bcde…尝试爆破出最后的字符串。