题解 | #迷宫问题#

迷宫问题

https://www.nowcoder.com/practice/cf24906056f4488c9ddb132f317e03bc

import java.util.Scanner;

import java.util.Arrays;
import java.util.List;
import java.util.ArrayList;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String[] line = in.nextLine().split(" ");
        int xTotal = Integer.parseInt(line[0]);
        int yTotal = Integer.parseInt(line[1]);
        int[][] arrs = new int[xTotal][yTotal];
        for (int i = 0 ; i < xTotal ; i++) {
            line = in.nextLine().split(" ");
            for (int j = 0; j < yTotal ; j++) {
                arrs[i][j] = Integer.parseInt(line[j]);
            }
        }
        int x = 0;
        int y = 0;
        List<String> path = new ArrayList<>();
        //添加起始坐标
        path.add("0,0");
        //记录当前错误的坐标
        String errStep = null;
        //循环直到(xTotal -1 ,yTotal -1)
        String endSep = (xTotal - 1) + "," + (yTotal - 1);
        while (!endSep.equals(x + "," + y)) {
            //寻找下一步
            String step = findNext(arrs, x, y, path, xTotal, yTotal, errStep);
            if (null != step) {
                //找到下一步,记录路径
                path.add(step);
                //坐标移动至下一步
                String[] steps = step.split(",");
                x = Integer.parseInt(steps[0]);
                y = Integer.parseInt(steps[1]);
            } else {
                //记录当前错误的坐标
                errStep = x + "," + y;
                //未找到下一步,退回一步
                String preStep = path.get(path.size() - 2);
                path.remove(path.size() - 1);
                String[] preSteps = preStep.split(",");
                x = Integer.parseInt(preSteps[0]);
                y = Integer.parseInt(preSteps[1]);
            }
        }
        path.forEach(a -> System.out.println("(" + a + ")"));
    }

    public static String findNext(int[][] arrs, int x, int y, List<String> path,
                                  int xTotal, int yTotal, String errorStep) {
        //上
        if (x - 1 >= 0 && arrs[x - 1][y] == 0) {
            String key = (x - 1) + "," + y;
            if (!path.contains(key) && !key.equals(errorStep)) {
                return key;
            }
        }
        //右
        if (x + 1 < xTotal && arrs[x + 1][y] == 0) {
            String key = (x + 1) + "," + y;
            if (!path.contains(key) && !key.equals(errorStep)) {
                return key;
            }
        }
        //左
        if (y - 1 >= 0  && arrs[x][y - 1] == 0) {
            String key = x + "," + (y - 1);
            if (!path.contains(key) && !key.equals(errorStep)) {
                return key;
            }
        }
        //下
        if (y + 1 < yTotal && arrs[x][y + 1] == 0) {
            String key = x + "," + (y + 1);
            if (!path.contains(key) && !key.equals(errorStep)) {
                return key;
            }
        }
        return null;
    }
}

全部评论

相关推荐

10-13 22:56
门头沟学院 C++
rt,鼠鼠的浪潮网签明天过期,鼠鼠是山东人,好像自己也能接受。之前的面试大厂基本挂干净了,剩下小米二面后在泡,问了下面试官没有挂,但要泡。还有海信似乎也通过了,不过在深圳,鼠鼠也不是很想去。其它还有一些公司应该陆陆续续还有一些面试,现在有些纠结是直接签了还是再等再面呢?大佬们能不能给鼠鼠提一些意见,万分感谢!!!
牛客78696106...:浪潮可不是开摆,当初我还是开发的时候我组长跟我说他们组有段时间天天1,2点走,早上5点就来,全组肝出来心肌炎,浪潮挣钱省立花可不是说说,当然也看部门,但是浪潮普遍就那dio样,而且你算下时薪就知道不高,没事也是9点半走,不然算你旷工
投递小米集团等公司10个岗位
点赞 评论 收藏
分享
09-13 08:41
服装/纺织设计
那一天的Java_J...:你第一次参加面试吗
点赞 评论 收藏
分享
10-01 09:50
门头沟学院 Java
肖先生~:这个人真的很好,点赞
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务