牛客网剑指offer中,“矩阵中的路径”一题有误
关于牛客网,剑指Offer中"矩阵中的路径"一题。缺少了一个testcase:matrix = 'ABEESFCSADME', rows=3, cols=4, path='SEE'
排行榜中大部分的答案都输出了错误的结果False
,正确应该是True
。
ABEE
SFCS
ADME
Python排行榜中的大部分答案都是这么写的,在if条件后直接return了,那么在四个方向判断中,如果先向下走,会导致提前return False,而不会再向上延伸。
# -*- coding:utf-8 -*-
class Solution:
def hasPath(self, matrix, rows, cols, path):
# write code here
for i in range(rows):
for j in range(cols):
if matrix[i*cols+j] == path[0]:
if self.find(list(matrix),rows,cols,path[1:],i,j):
return True
return False
def find(self,matrix,rows,cols,path,i,j):
if not path:
return True
matrix[i*cols+j]='0'
if j+1<cols and matrix[i*cols+j+1]==path[0]:
return self.find(matrix,rows,cols,path[1:],i,j+1)
elif j-1>=0 and matrix[i*cols+j-1]==path[0]:
return self.find(matrix,rows,cols,path[1:],i,j-1)
elif i+1<rows and matrix[(i+1)*cols+j]==path[0]:
return self.find(matrix,rows,cols,path[1:],i+1,j)
elif i-1>=0 and matrix[(i-1)*cols+j]==path[0]:
return self.find(matrix,rows,cols,path[1:],i-1,j)
else:
return False
正确的解法应该是这样。
class Solution:
def hasPath(self, matrix, rows, cols, path):
for i in range(rows):
for j in range(cols):
if matrix[i*cols + j] == path[0]:
if self.spread(list(matrix), rows, cols, path[1:], i, j):
return True
return False
def spread(self, matrix, rows, cols, path, i, j):
if not path:
return True
matrix[i*cols + j] = '-'
spreaded = False
for x, y in ((i-1, j), (i+1, j), (i, j-1), (i, j+1)):
if 0<=x<rows and 0<=y<cols and matrix[x*cols+y]==path[0]:
if self.spread(matrix, rows, cols, path[1:], x, y):
spreaded = True
return spreaded
#测试#