矩阵中的路径判断-Java基础

题目描述

判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向上下左右移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。

解题思路:
    1、将输入得字符数组转换为矩阵,或者直接输入二维数组;
    2、回溯搜索所有结果进行判断是否

import java.util.ArrayList;
import java.util.List;
/**
 * @author ycy
 * 题目描述:
 *   判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向上下左右移动一个格子。
 *   如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。
 * 解题思路:
 *    1、将输入得字符数组转换为矩阵,或者直接输入二维数组;
 *    2、回溯搜索所有结果进行判断是否
 */
public class matrixPath12_77 {
    static int rows=3;
    static int cols=4;
    private final static int[][] next = {{0,-1},{0,1},{-1,0},{1,0}};//下一个元素
    
    private static boolean backtracking(char matrix[][],char str[],boolean marked[][],int pathLen,int r,int c){
        if(pathLen == str.length) return true;
        if(r<0 || r>=rows || c<0 ||c>=cols || matrix[r][c] != str[pathLen] || marked[r][c]){
            return false;
        }
        marked[r][c] = true;
        for(int[] n: next){  //代替 i, j - 1 和 i - 1, j 和 i, j + 1 和 i + 1, j
            if(backtracking(matrix,str,marked,pathLen+1,r+n[0],c+n[1]))    //所有得下一个元素进行判断            
                return true;
        }
        marked[r][c] = false;
        return false;
    }
    
    public static boolean hasPath(char array[],int rows, int cols, char str[]){  //判断是否包含这个路径,递归回溯
        if(rows==0||cols==0) return false;
        boolean marked[][] = new boolean[rows][cols];
        char matrix[][] = buildMatrix(array,rows,cols);
        for(int i=0;i<rows;i++)
        {
            for(int j=0;j<cols;j++)
            {
                System.out.print(matrix[i][j]+" ");
                if(backtracking(matrix,str,marked,0,i,j)); //递归去找下一个                
                    return true;
            }
        }
        return false;
    }
    
    private static char[][] buildMatrix(char[] array,int rows,int cols){  //数组转换为矩阵
        char[][] matrix = new char[rows][cols];
        for(int i=0,idx=0;i<rows;i++)
        {
            for(int j=0;j<cols;j++){
                matrix[i][j] = array[idx++];
            }
        }
        return matrix;
    }
    public static void main(String[] args) {
        
        char[] array = {'a','b','t','g','c','f','c','s','j','d','e','h'};
        char str[] = {'a','b','c','d'};
    
        char matrix[][] = buildMatrix(array,3,4);
        for(int i=0;i<rows;i++){   //矩阵打印成现
            for(int j=0;j<cols;j++){
                System.out.print(matrix[i][j]+" ");
            }
            System.out.println(" ");
        }                
        
        boolean result = hasPath(array,4,3,str);   //调用测试是否存在该路径
        System.out.print("是否存在该路径"+result);
    }
}

扫码关注一起随时随地学习!!!就在洋葱攻城狮,更多精彩,等你来!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

洋葱ycy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值