复现

2021/8/12 6:07:30

本文主要是介绍复现,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

KCTF 第二题 南冥神功


硬看,发现通关要求是把aS_1全搞成1

然后这里是在aS_1数组里的移动,像是二维平面八方向走一样
有个很智障的地方就是aS_1的起始数值是这个'S'不是0……直接跳过结果搜不出路径


只能走到为0的位置,走过之后就置为1,也就是一笔画路径

搜了一下果然只有一条符合要求的路径,然后根据方向输出每一次case的选项

a=[1,0,1,0,0,1,0,0,1,1,
   1,1,0,0,1,0,0,1,0,0,
   0,0,1,0,1,1,1,1,1,0,
   0,1,1,0,1,0,0,1,0,0,
   0,0,1,0,0,1,0,0,1,1,
   1,1,0,1,1,1,0,1,0,1,
   0,0,1,1,1,1,0,1,0,1,
   0,1,1,0,0,1,0,1,0,1,
   0,0,0,1,0,0,1,1,0,0]
dj=[[-1,0],[0,1],[1,0],[1,-1],[0,-1],[-1,-1]]
du=[[-1,1],[0,1],[+1,+1],[1,0],[0,-1],[-1,0]]
v=150*[0]
s=150*[0]
top=0

def dfs(w,x,y):
    # print(w,x,y)
    global top
    if w==46:
        print(x,y)
        for i in range(46):
            print("%d,"%s[i],end='')
        return
    if x&1:
        for i in range(6):
            if x+dj[i][0]>=0 and x+dj[i][0]<9 and y+dj[i][1]>=0 and y+dj[i][1]<10 and a[(x+dj[i][0])*10+y+dj[i][1]]==0 and v[(x+dj[i][0])*10+y+dj[i][1]]==0:
                v[(x+dj[i][0])*10+y+dj[i][1]]=1
                s[top]=i
                top+=1
                dfs(w+1,x+dj[i][0],y+dj[i][1])
                v[(x+dj[i][0])*10+y+dj[i][1]]=0
                top-=1
    else:
        for i in range(6):
            if x+du[i][0]>=0 and x+du[i][0]<9 and y+du[i][1]>=0 and y+du[i][1]<10 and a[(x+du[i][0])*10+y+du[i][1]]==0 and v[(x+du[i][0])*10+y+du[i][1]]==0:
                v[(x+du[i][0])*10+y+du[i][1]]=1
                s[top]=i
                top+=1
                dfs(w+1,x+du[i][0],y+du[i][1])
                v[(x+du[i][0])*10+y+du[i][1]]=0
                top-=1

if __name__=='__main__':
    # print(a.count(0))
    print(a.count(0))
    v[0]=1
    dfs(0,0,0)
#1,2,3,4,3,2,1,2,3,4,3,2,1,1,0,1,2,1,0,0,5,0,5,4,3,4,5,0,5,0,1,2,1,0,1,2,1,2,3,4,3,2,2,3,2,1,

然后一个flag字符对应走两步,加上这两次的约束条件发现每个flag位置符合要求的字符唯一
脚本:

a=[1,2,3,4,3,2,1,2,3,4,3,2,1,1,0,1,2,1,0,0,5,0,5,4,3,4,5,0,5,0,1,2,1,0,1,2,1,2,3,4,3,2,2,3,2,1]
d='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
for i in range(0,len(a),2):
    for j in range(len(d)):
        if (i//2+j)%6==5-a[i] and (i//2+j//6)%6==a[i+1]:
            print(d[j],end='')
#GJ0V4LA4VKEVQZSVCNGJ00N


这篇关于复现的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程