您的位置:首页 > 其它

剑指_矩阵中的路径_回溯法

2017-12-02 18:36 246 查看
用回溯法来解决查找矩阵中字符串的路径。

第一:定义当前访问字符串的第几个节点pathLength。

第二:定义与当前矩阵大小相同bool矩阵来判断当前节点是否被访问visited。

第三:解决方案,需要定义两个函数,第一个函数,判断是否找到整个路径结果。第二个函数,依次判断是否在矩阵中找到每个字符。

package Jianzhi;

public class juzhen_12 {
public static void main(String[] args) {
System.out.println(hasPath("ABCESFCSADEE".toCharArray(), 3, 4,
"ABCCED".toCharArray()));
}
public static boolean hasPath(char[] matrix,int rows,int cols,char[] str) {
if(matrix==null||rows<=0||cols<=0||matrix.length!=rows*cols||str==null) {
return false;
}

int pathLength=0;
boolean[] visited=new boolean[rows*cols];
for(int i=0;i<visited.length;i++) {
visited[i]=false;
}
for(int i=0;i<rows;i++) {
for(int j=0;j<cols;j++) {
if(corePath(matrix,rows,cols,str,i,j,pathLength,visited)) {
//这两个for循环是为了在矩阵中找到第一个节点
return true;
}
}
}
return false;

}
public static boolean corePath(char[] matrix,int rows,int cols,char[] str,int row,int col,int pathLength,boolean[] visited) {
boolean hasPath=false;
if(pathLength==str.length) {//因为找到最后一个节点,pathLength仍然加1,刚好为str.length就退出
return true;
}
if(row<rows&&row>=0&&col<cols&&col>=0&&matrix[row*cols+col]==str[pathLength]&&!visited[row*cols+col]) {
visited[row*cols+col]=true;
pathLength++;
//进入该if条件,即代表找到该节点,递归地进行找下一节点
//接下来递归的尝试在上下左右找下一个节点,看能否找到
hasPath=corePath(matrix,rows,cols,str,row-1,col,pathLength,visited)||
corePath(matrix,rows,cols,str,row+1,col,pathLength,visited)||
corePath(matrix,rows,cols,str,row,col-1,pathLength,visited)||
corePath(matrix,rows,cols,str,row,col+1,pathLength,visited);
//递归地进行到最后一个节点,并且找到时,hasPath会被赋值为true
//如果上下左右,都找不到,都是为false的情况下,则尝试向回溯上一个节点
if(!hasPath) {
pathLength--;
visited[row*cols+col]=false;
}
}
//如果没有能满足的条件上面条件的,则返回false
return hasPath;//注意最后返回hasPath
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: