废话不多说,先上题
对应代码如下:
def dfs(x,y):
global num
for i in range(0,4):
dir=[(-1,0),(0,-1),(1,0),(0,1)]
nx,ny=x+dir[i][0] ,y+dir[i][1]
if nx<0 or nx>=hx or ny <0 or ny>wy: continue
if mp[nx][ny]=='*':
num+=1
print("%d:%s->%d%d"%(num,p[x][y],nx,ny))
continue
if mp[nx][ny]=='.':
mp[nx][ny]='#'
p[nx][ny]=p[x][y]+'->'+str(nx)+str(ny)
dfs(nx,ny)
mp[nx][ny]='.'
num=0
wy,hx=map(int,input().split())
a=['']*10
for i in range(wy):
a[i]=list(input())
mp=[['']*(10) for i in range(10)]
for x in range(hx):
for y in range(wy):
mp[x][y]=a[y][x]
if mp[x][y]=='@': sx=x;sy=y
if mp[x][y]=='*': tx=x;ty=y
print("from %d%d to %d%d"%(sx,sy,tx,ty))
p=[['']*(10) for i in range(10)]
p[sx][sy]=str(sx)+str(sy)
dfs(sx,sy)
几句话简单解释一下DFS,就是deep search嘛,搜索不到底不结束,我的记忆方式就是“不撞南墙不回头”,哈哈哈。对应的含义就是,在树结构的搜索过程中,始终要搜索到最深层树结构,然后再返回上一层进行下一步搜索,再次搜索到最深层,如此反复,直到搜索完全路径并将符合结果输出。
紧接着,解释一下上面的代码
经过几道DFS,亦或是BFS的题目训练,我发现其中其实是有讨论可循的。
比如,都存在一个位移数组列表,[(0,1),(1,0),(-1,0),(0,-1)],当然,也有里面没有使用元组,使用的list of list格式的情况。
上面是第一个转移搜索目标所需要的模块,第二个模块就是格式化输入了,把题目所需要输入的数据全都接受起来,一般对于Python就是map函数+input().split()了。
再就是第三个模块,也是最重要的,就是对应的搜索了。首先需要明确终止条件,然后再展开用代码描述思路。
上面题目中直接将搜索的全过程集成到一个函数中了,这样其实也更加方便main函数中直接调用即可。
对于DFS内部的迭代,其实就是用代码语言来阐述题干想要表达的内容了。就是一个转化的过程。
此外,再有一个格式化输出的模块,使用print("from %d%d to %d%d"%(sx,sy,tx,ty))