题目描述
有一个 h 行 w 列的网格,我们使用 (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 1≤h,w≤100) 代表迷宫的行数和列数。
此后 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 0≤ai,j≤1) 代表迷宫的布局。其中, 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) (h−1,w−1),且路径上每个单元格都是空方格,行走的单元格都是彼此相邻的。
示例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;
}
}
}
1395

被折叠的 条评论
为什么被折叠?



