算法11:判断一个二维字符矩阵中是否包含有一条字符串所含字符组成的路径

#算法11;判断一个二维矩阵中是否有一个字符串,它通过一个每个格点有且仅一次,不能重复通过

#这里定义的是搜索的四个方向
# x + 0, y - 1 ->向"上"搜索
# x + 0, y + 1 ->向"下"搜索
# x - 1, y + 0 ->向"左"搜索
# x + 1, y + 0 ->向"右"搜索
next_ = [[0,-1],[0,1],[-1,0],[1,0]]

#这个函数的功能就是将字符转换为矩阵形式
#转换函数所用为:buildMatrix
#然后建立一个同样大小的标记矩阵:marked
#通过在标记矩阵中记录搜索过的地方来对每个矩阵点进行搜索(上下左右四个方向)
#而搜索的方法就是"回溯法"?->所用函数名称为:backtracking
#“回溯法”在搜索的时候从矩阵左上角点开始搜索:然后方别搜索这一点的四个方向
#从四个方向又是四个"搜索点",每一个"搜索点"开始分别再向四周(上下左右)搜索
#直到"搜索点"处的字符与目标字符串中对应位置字符不同(失败),或者搜索点不存在(位于矩阵索引值范围外->失败)
#或者达到搜索字符串长度值(成功),或者搜索点处已经被搜索过(标记二维列表中对应点处被标记过->失败)
def hasPath(array,rows,cols,strs):
    if rows == 0 or cols == 0:
        return False
    hereRows = rows
    hereCols = cols
    marked = [[0]*hereCols for row in range(hereRows)]
    #这里打印出我们初始标记二维列表
    matrix = buildMatrix(array,rows,cols)
    print("Our searching result is:")
    for i in range(rows):
        for j in range(cols):
            if backtracking(matrix,strs,marked,0,i,j):
                return True
    return False


def buildMatrix(array,rows,cols):
    idx = 0
    matrix = [[None]*cols for row in range(rows)]
    for r in range(rows):
        for c in range(cols):
            matrix[r][c] = array[idx]
            idx += 1
    #这里打印出我们构造好的矩阵
    print(matrix)
    return matrix


#回溯搜索方法:它和递归有相似的地方就是"一直调用自身"
#不同的地方就是:它在搜索求解不成功的情况下,会"修复"它所走过的出发点
#在记录矩阵中除去它所留下的痕迹(这是在该点四周一个都不成功的情况下)
#只要某点出发,四个方向至少有一个方向有成功搜索的情况,那么该点仍然不会被除去搜索痕迹
def backtracking(matrix,strs,marked,pathLen,r,c):
    if pathLen == len(strs):
        return True
    if r<0 or r>=rows or c<0 or c>=cols or matrix[r][c]!=strs[pathLen] or marked[r][c]:
        return False
    marked[r][c] = 1
    for n in next_:
        if backtracking(matrix,strs,marked,pathLen+1,r+n[0],c+n[1]):
            return True
    marked[r][c] = 0
    return False


#这里设置矩阵行列数
rows = 3
cols = 4
#这里定义矩阵中元素->搜索二维矩阵内值(即字符串搜索范围)
array = [e for e in "abtgcfcsjdeh"]
#print(array)->输出验证是否表达正确

#这里定义被搜索字符串值
strs = "bfce"
print("Our searching target string is:")
print(strs)
print("Our built matrix:")
#搜索第一个字符串"bcfe"是否成功呢?
print(hasPath(array,rows,cols,strs))
print('\n')

strs2 = "acbf"
print("Our searching target string2 is:")
print(strs2)
print("Our built matrix:")
#搜索第二个字符串是否成功呢?
print(hasPath(array,rows,cols,strs2))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值