【nowcoder】HJ43 迷宫问题(DFS(深度优先搜索))

【nowcoder】HJ43 迷宫问题

题目描述

题目链接:【nowcoder】HJ43 迷宫问题

有一个 hw 列的网格,我们使用 (i,j) 表示网格中从上往下数第 i 行和从左往右数第 j 列的单元格。每个方格要么是可以通过的空方格"0",要么是不可通过的偏方格"1",特别的,网格的四周都是偏方格,你可以沿着空方格上下左右随意移动:从 (x,y) 向上移动一格即抵达 (x-1,y),向下移动一格即抵达 (x+1,y),向左移动一格即抵达 (x,y-1),向右移动一格即抵达 (x,y+1)

现在,你位于迷宫的入口 (0,0),想要前往终点 (h-1,w-1)。请输出一条从起点到终点的可行路径。

保证起点和终点一定为空方格,你始终可以找到目前唯一找到一条从起点出发到达终点的可行路径。

输入描述:

第一行输入两个整数 h , w h, w h,w ( 1 ≤ h , w ≤ 100 1 \leq h, w \leq 100 1h,w100) 代表迷宫的行数和列数。
此后 h h h 行,第 i i i 行输入 w w w 个整数 a i , 1 , a i , 2 , … , a i , w a_{i, 1}, a_{i, 2}, \ldots, a_{i, w} ai,1,ai,2,,ai,w ( 0 ≤ a i , j ≤ 1 0 \leq a_{i, j} \leq 1 0ai,j1) 代表迷宫的布局。其中, a i , j = 0 a_{i, j} = 0 ai,j=0 表示单元格 ( i , j ) (i, j) (i,j) 是空方格, a i , j = 1 a_{i, j} = 1 ai,j=1 表示单元格 ( i , j ) (i, j) (i,j) 是墙方格。

输出描述:

输出若干行,第 i i i 行输出两个整数 x i , y i x_i, y_i xi,yi,表示路径的第 i i i 步抵达的单元格坐标为 ( x i , y i ) (x_i, y_i) (xi,yi)
你需要保证输出的路径是否符合题目要求的,即从起点 ( 0 , 0 ) (0, 0) (0,0) 出发,到达终点 ( h − 1 , w − 1 ) (h - 1, w - 1) (h1,w1),且路径上每个单元格都是空方格,行走的单元格都是彼此相邻的。

示例1:

输入
5 5
0 1 0 0 0
0 1 1 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0
输出
(0,0)
(1,0)
(2,0)
(2,1)
(2,2)
(2,3)
(2,4)
(3,4)
(4,4)

示例2:

输入
5 5
0 1 0 0 0
0 1 0 1 0
0 0 0 0 1
0 1 1 1 0
0 0 0 0 0
输出
(0,0)
(1,0)
(2,0)
(3,0)
(4,0)
(4,1)
(4,2)
(4,3)
(4,4)

解题思路

DFS遍历所有可能的路径,到达目标位置时输出即可

Java代码

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int h = sc.nextInt(), w = sc.nextInt();
        int MM[][] = new int[h][w], used[][] = new int[h][w];
        for (int i = 0; i < h; i++) {
            for (int j = 0; j < w; j++) {
                MM[i][j] = sc.nextInt();
                used[i][j] = 0;
            }
        }
        dfs(0, 0, h, w, new ArrayList<Cur>(), MM, used);

    }

    public static void dfs(int x, int y, int h, int w, List<Cur> resList, int MM[][], int used[][]) {
        if (x < 0 || y < 0 || x >= h || y >= w || MM[x][y] == 1 || used[x][y] == 1) {
            return;
        }

        used[x][y] = 1;
        Cur cur = new Cur(x, y);
        resList.add(cur);

        if (x == h - 1 && y == w - 1) {
            for (Cur res : resList) {
                System.out.println(String.format("(%d,%d)", res.x, res.y));
            }
            return;
        }

        for (int i = 0; i < 4; i++) {
            int xx = x + dirc[i][0];
            int yy = y + dirc[i][1];
            dfs(xx, yy, h, w, resList, MM, used);
        }

        used[x][y] = 0;
        resList.remove(cur);
    }

    public static int dirc[][] = new int[][] {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};

    public static class Cur {
        int x;
        int y;

        public Cur(int x, int y) {
            this.x = x;
            this.y = y;
        }
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值