package cn.csu.offers;
/**
* 矩阵中的路径
* @author Tiekai Ba 2017年6月3日
*
*/
public class Offer_66 {
/**
* 在矩阵matrix中查找是否存在连续字符串路径str
* @param matrix 矩阵字符数组
* @param rows 矩阵行数
* @param cols 矩阵列数
* @param str 待查找字符串路径
* @return 存在返回true 不存在返回false
*/
public boolean hasPath(char[] matrix,int rows,int cols,char[] str){
if(matrix == null || rows < 1 || cols < 1 || str == null){//参数校验
return false;
}
boolean[] visit = new boolean[rows*cols];//标记访问过的矩阵坐标位置,初始化为false
for(int i = 0; i < rows; i ++){
for(int j = 0 ;j < cols; j ++){
if(hasPathCore(matrix,rows,cols,i,j,str,0,visit)){
return true;
}
}
}
return false;
}
/**
* 回溯法匹配字符串路径
* @param matrix 矩阵字符数组
* @param rows 矩阵行数
* @param cols 矩阵列数
* @param i 当前匹配矩阵元素的行坐标
* @param j 当前匹配矩阵元素的列坐标
* @param str 匹配字符串
* @param k 当前匹配字符串元素的下标
* @param visit 标记匹配过的矩阵元素位置
* @return
*/
private boolean hasPathCore(char[] matrix, int rows, int cols, int row,
int col, char[] str, int current, boolean[] visit) {
int index = row*cols + col;
if(row >= rows || col >= cols || row < 0 || col < 0 || visit[index] || matrix[index] != str[current]){
return false;
}
visit[index] = true;//当前k下标的字符匹配成功
if(current == str.length-1){
return true;
}
current ++;//准备匹配下一个字符
if(hasPathCore(matrix, rows, cols, row-1, col, str, current, visit)||//试探当前字符的上方字符
hasPathCore(matrix, rows, cols, row+1, col, str, current, visit)||//试探当前字符的下方字符
hasPathCore(matrix, rows, cols, row, col-1, str, current, visit)||//试探当前字符的左方字符
hasPathCore(matrix, rows, cols, row, col+1, str, current, visit)//试探当前字符的右方字符
){
return true;
}
current --;//如果四个方向的都不对,表明上一个字符匹配不对,回退
visit[index] = false;
return false;
}
public static void main(String[] args) {
char[] matrix = {'a','b','c','e',
's','f','c','s',
'a','d','e','e'};
String str = "abceseecfdas";
Offer_66 offer_66 = new Offer_66();
System.out.println(offer_66.hasPath(matrix, 3, 4, str.toCharArray()));
}
}
回溯法--矩阵中的路径问题(java)
原文作者:回溯法
原文地址: https://blog.csdn.net/u011514514/article/details/72854895
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://blog.csdn.net/u011514514/article/details/72854895
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。