关注
import java.util.*;
/**
* Created by wxn
* 2019/9/3 19:02
* <p>
* 题目描述:
* 假设以一个n*m的矩阵作为棋盘,每个棋位对应一个二维坐标 (x, y)。你有一颗棋子位于左上起点(0, 0),现在需要将其移动到右下底角 (n-1, m-1),棋子可以向相邻的上下左右位置移动,每个坐标最多只能经过一次。棋盘中散布着若干障碍,障碍物不能跨越,只能绕行,问是否存在到达右下底角的路线?若存在路线,输出所需的最少移动次数;若不存在,输出0。 Input 第一行三个正整数n,m和k,代表棋盘大小与障碍物个数 1< n、m < 100, k < n*m 第二行至第k+1行,每行为两个整数x和y,代表k个障碍物的坐标。
* <p>
* 输入
* 输入三个正整数n,m和k,代表棋盘大小与障碍物个数 1< n、m < 100, k < n*m
* <p>
* 第二行至第k+1行,每行为两个整数x和y,代表k个障碍物的坐标。
* <p>
* 输出
* 输出从起点到终点的最短路径的长度,如果不存在,即输出0
*/
public class Main {
static int[][] d = {
{-1, 0},
{0, 1},
{1, 0},
{0, -1}
};
static int startX = 0;
static int startY = 0;
static int endX = 0;
static int endY = 0;
static Set<Integer> stepList = new HashSet<>();
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
in.nextLine();
//棋盘,障碍物为1,否则为0
/**
* 5
* .#...
* ..#S.
* .E###
* .....
* .....
*/
char[][] board = new char[n][n];
for (int i = 0; i < n; i++) {
String line = in.nextLine();
for (int j = 0; j < n; j++) {
board[i][j] = line.charAt(j);
if (board[i][j] == 'S') {
startX = i;
startY = j;
} else if (board[i][j] == 'E') {
endX = i;
endY = j;
}
}
}
shortestLength(board, n);
if (stepList.size() == 0) {
System.out.println(-1);
return;
}
int minStep = Integer.MAX_VALUE;
for (Integer integer : stepList) {
if (integer < minStep) {
minStep = integer;
}
}
System.out.println(minStep);
}
private static void shortestLength(char[][] board, int n) {
boolean[][] visited = new boolean[n][n];
visited[startX][startY] = true;
shortestLength(board, n, startX, startY, 0, visited);
}
private static void shortestLength(char[][] board, int n, int startX, int startY, int step, boolean[][] visited) {
if (startX == endX && startY == endY) {
stepList.add(step);
return;
}
for (int i = 0; i < 4; i++) {
int newX = startX + d[i][0];
int newY = startY + d[i][1];
if (newX < 0) {
newX = n - 1;
} else if (newX==n) {
newX = 0;
}
if (newY <0) {
newY = n-1;
}else if (newY==n){
newY = 0;
}
if (board[newX][newY] !='#' && !visited[newX][newY]) {
visited[newX][newY] = true;
shortestLength(board, n, newX, newY, step + 1, visited);
visited[newX][newY] = false;
}
}
}
}
查看原帖
点赞 2
相关推荐
点赞 评论 收藏
转发
点赞 评论 收藏
转发
牛客热帖
正在热议
# 牛客帮帮团来啦!有问必答 #
731105次浏览 11739人参与
# 非技术岗是怎么找实习的 #
74770次浏览 1400人参与
# 海康威视求职进展汇总 #
91670次浏览 1094人参与
# 浅聊一下我实习的辛苦费 #
81640次浏览 763人参与
# 如何写一份好简历 #
263315次浏览 3966人参与
# 硬件人求职现状 #
185189次浏览 2709人参与
# 通信硬件人笔面经互助 #
112007次浏览 2263人参与
# 面试等了一周没回复,还有戏吗 #
40635次浏览 500人参与
# 机械制造面试记录 #
37657次浏览 505人参与
# 24届营销人拿到了几个offer #
4247次浏览 62人参与
# 铜五铁六真的存在吗? #
28348次浏览 298人参与
# 实习生应该准时下班吗 #
76902次浏览 571人参与
# 打工人的辛酸 #
8629次浏览 134人参与
# 运营人的第一份offer应该如何选 #
35333次浏览 643人参与
# 美的求职进展汇总 #
39029次浏览 419人参与
# 如何看待offer收割机的行为 #
224255次浏览 3256人参与
# 产品实习,你更倾向大公司or小公司 #
36504次浏览 560人参与
# 数据人offer决赛圈怎么选 #
44840次浏览 728人参与
# 实习与准备秋招该如何平衡 #
172098次浏览 3115人参与
# 通信硬件薪资爆料 #
201093次浏览 1824人参与