package common;
/**
* @author : zhaoliang
* @program :newCoder
* @description : 矩阵中的路径
* @create : 2020/12/17 19:42
*/
public class hasPath {
//请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。
//路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。
//如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。
private final static int[][] next = {{0,1},{0,-1},{1,0},{-1,0}};
public boolean hasPath(char[] array,int cols,int rows,char[] str){
if(rows==0||cols==0)return false;
char[][] matrix = buildMatrix(array,rows,cols);
boolean[][] isMarked = new boolean[rows][cols];
for (int i = 0; i <rows ; i++) {
for (int j = 0; j <cols ; j++) {
if (backtracking(matrix,str,isMarked,0,i,j)){
return true;
}
}
}
return false;
}
private boolean backtracking(char[][] matrix, char[] str, boolean[][] isMarked, int pathLen, int r, int c) {
if (pathLen == str.length)return true;
if (r <0 || r >=matrix.length || c <0 || c >=matrix[0].length || isMarked[r][c] || matrix[r][c] != str[pathLen] )return false;
isMarked[r][c] = true;
for (int [] n:next) {
if (backtracking(matrix,str,isMarked,pathLen+1,r+n[0],c+n[1])){
return true;
}
}
isMarked[r][c] = false;
return false;
}
private char[][] buildMatrix(char[] array, int rows, int cols) {
char[][] matrix = new char[rows][cols];
for (int r = 0,idx=0; r <rows ; r++) {
for (int c = 0; c <cols ; c++) {
matrix[r][c] = array[idx++];
}
}
return matrix;
}
}
常见算法-矩阵中的路径
最新推荐文章于 2021-06-12 13:02:05 发布