关注
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
相关推荐
04-27 20:33
华东理工大学 C++ 点赞 评论 收藏
分享
牛客热帖
更多
- 1... AI Agent 面试 Top50 必刷题2.5W
- 2... 看不懂组内文档,实习怎么偷产出?8644
- 3... 五月了,感觉实习很难找了6033
- 4... 解决了xd们,发了个dy曝光视频,十几万播放,直接让他火速联系我,赔我路费了,兄弟们碰到不公平的违法行为,一定要积极捍卫自己权益6002
- 5... 妈妈只想要你快乐4129
- 6... 要对实习同事表白吗?3859
- 7... 26届双非本求职总结3600
- 8... 三段大厂,说下我见过的最低学历3189
- 9... 理性讨论,卷实习算不算工贼行为?3116
- 10... 实习一个星期,我因为只加了20分钟班被开除了3058
正在热议
更多
# 26届春招投递记录 #
36548次浏览 307人参与
# 你今年的平均薪资是多少? #
230190次浏览 1069人参与
# 如何成为1个AI工程师? #
5766次浏览 281人参与
# 携程笔试 #
180065次浏览 928人参与
# 27届实习投递记录 #
121891次浏览 1382人参与
# 我想象的实习vs现实的实习 #
340796次浏览 2316人参与
# 求职你最看重什么? #
170396次浏览 915人参与
# 秋招提前批,你开始投了吗 #
766642次浏览 8495人参与
# 工作丧失热情的瞬间 #
401279次浏览 2589人参与
# 要毕业了,再不说就来不及了 #
9290次浏览 154人参与
# 哪些公司校招卡第一学历 #
262469次浏览 879人参与
# 硬件人的简历怎么写 #
349638次浏览 3141人参与
# 国庆假期,给大脑放个假 #
26940次浏览 121人参与
# 你在职场上见过哪些“水货”同事 #
42004次浏览 179人参与
# 机械人的秋招小目标 #
32956次浏览 251人参与
# 面试被问第一学历差时该怎么回答 #
297200次浏览 2306人参与
# 你觉得机械有必要实习吗 #
89083次浏览 537人参与
# AI面会问哪些问题? #
136858次浏览 3688人参与
# 提名点击就挂的公司 #
146708次浏览 494人参与
# 听到哪句话就代表面试稳了or挂了? #
271358次浏览 1733人参与
