地下迷宫

来源:互联网 发布:韩语视频翻译软件 编辑:程序博客网 时间:2024/04/28 12:00


import java.util.*;/** * 题目大意:n*m格迷宫,1代表青蛙可以通过,0不能通过 * 青蛙体力值P,每次走一步,横向走消耗体力值1,向下走不消耗体力, * 向上走消耗体力值3. * 青蛙初始位置(0,0),迷宫出口(0,m-1) * 求青蛙走出迷宫的路径 */public class Main {    static class Node {        int x;        int y;        int p;        Node(int x, int y,int p) {            this.x = x;            this.y = y;            this.p = p;        }    }    static int[][] dir = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};    static int[] cost = {3,0,1,1};    static List<Node> path;    public static void main(String[] arg) {        Scanner scan = new Scanner(System.in);        while (scan.hasNext()) {            path = new ArrayList<>();            int n = scan.nextInt();            int m = scan.nextInt();            int p = scan.nextInt();            int[][] matrix = new int[n][m];            for (int i = 0; i < n; i++) {                for (int j = 0; j < m; j++) {                    matrix[i][j] = scan.nextInt();                }            }            boolean[][] isVisited = new boolean[n][m];            isVisited[0][0] = true;            path.add(new Node(0,0,p));            boolean hasPath = dfs(matrix,isVisited,0,0,p);            if (!hasPath) {                System.out.println("Can not escape!");            }else {                int size = path.size() - 1;                Node node;                for (int i = 0; i < size; i++) {                    node = path.get(i);                    System.out.print("[" + node.x + "," +node.y +"],");                }                node = path.get(size);                System.out.println("[" + node.x + "," +node.y +"]");            }        }        scan.close();    }    private static boolean dfs(int[][] matrix,boolean[][] isVisited,                               int x, int y, int p) {        int n = matrix.length;        int m = matrix[0].length;        if (p <= 0 && x != 0 && y != m - 1) {            return false;        }        if (x == 0 && y == m - 1 && p >= 0) {            return true;        }        for (int i = 0; i < 4; i++) {            int nx = x + dir[i][0];            int ny = y + dir[i][1];            if (!isInside(n,m,nx,ny)) {                continue;            }            if (matrix[nx][ny] == 1 && !isVisited[nx][ny]) {                isVisited[nx][ny] = true;                // System.out.println("push nx="+nx+" ny="+ny+" p="+(p-cost[i]));                Node node = new Node(nx,ny,p-cost[i]);                path.add(node);                if (dfs(matrix,isVisited,nx,ny,p-cost[i])){                    return true;                }                isVisited[nx][ny] = false;                // System.out.println("pop nx="+nx+" ny="+ny+" p="+(p-cost[i]));                path.remove(node);            }        }        return false;    }    private static boolean isInside(int n,int m,int x,int y) {        return x >= 0 && x < n && y >= 0 && y < m;    }}


0 0