栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java 回溯法 求矩阵路径

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java 回溯法 求矩阵路径

问题:从矩阵左上角到右下角有多少条路径,只能向右或向下走。矩阵中的元素由1和0组成,1代表可以通过,0代表障碍物。
两种方法,本质上没有区别
方法一

import java.util.Scanner;

public class Demo111 {
    private static int count = 0;  //定义全局变量,记录矩阵数目
    private static boolean[][] visited;

    public static void main(String[] args) {
        int[][] mat = {{1, 0, 0}, {1, 1, 1}, {1, 1, 1}};
        visited = new boolean[3][3];
        recur(mat, 0, 0);
        System.out.println(count);
    }

    private static boolean recur(int[][] mat, int i, int j) {
        if (i < 0 || i >= mat.length || j < 0 || j >= mat[0].length || visited[i][j] ||mat[i][j] == 0) {
            return false;  
        }
        if(i==mat.length-1 && j ==mat[0].length-1){
            count++;
            return true;
        }
        visited[i][j] = true;
        boolean res = recur(mat, i, j+1);
        res = recur(mat, i+1,j) || res; //注意,如果使用boolean类型做返回值,需要将两次递归分开写,因为||特性是如果第一个表达式为true则不会计算第二个表达式
        visited[i][j] = false;
        return res;
    }
}

方法二

public class Demo112 {
    private static boolean[][] visited;

    public static void main(String[] args) {
        int[][] mat = {{1, 0, 0}, {1, 1, 1}, {1, 1, 1}};
        visited = new boolean[3][3];
        int result = recur(mat, 0, 0);
        System.out.println(result);
    }

    private static int recur(int[][] mat, int i, int j) {
        if (i < 0 || i >= mat.length || j < 0 || j >= mat[0].length || visited[i][j] || mat[i][j] == 0) {
            return 0;
        }
        if (i == mat.length && j == mat[0].length) {
            return 1;
        }

        visited[i][j] = true;
        int res = recur(mat, i, j + 1) + recur(mat, i + 1, j);
        visited[i][j] = false;
        return res;
    }
}

附加:
剑指offer12 矩阵中的路径
也可以用类似上面的思想去做,回溯+剪枝(参考评论区K神做法)

class Solution {
    public boolean exist(char[][] board, String word) {
        for (int i = 0; i < board.length; i++) {
            for (int j = 0; j < board[0].length; j++) {
                boolean re = recur(board, word, i, j, 0);
                if(re == true){
                    return true;
                }
            }
        }
        return false;
    }
    public static  boolean recur(char[][] board, String word,int i, int j,int k){
        if(i<0||i>board.length-1||j<0||j>board[0].length-1||word.charAt(k)!=board[i][j]){
            return false;
        }
        if(k==word.length()-1){
            return true;
        }

        char temp = board[i][j];
        board[i][j] = ' ';
        boolean res = recur(board, word, i+1, j, k+1) || recur(board, word, i, j+1, k+1) || recur(board, word, i-1, j, k+1) || recur(board, word, i, j-1, k+1);
        board[i][j] = temp;
        return res;
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/336686.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号