ChamPly 2015-05-31 23:17 采纳率: 0%
浏览 3017

关于Java的走迷宫问题

题目是这样的:
用户输入一个值,生成一个n*n的矩阵,然后每个符号之间用空格隔开,要求从A到B,如果当前位置的坐标是“+”那么下一个坐标则必须为“-”,找出最短的路径的步数

我的代码是把所有的情况写出来,但是出错了,请各位大神看看哪里有问题

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

public class Main {

//矩阵的大小
static int n;
//用于记录是否走到了终点,true表示到了,false表示没有到,默认false
static boolean flag = false;
//用于存放所有的结果
static ArrayList<Integer> list = new ArrayList<Integer>();

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    n = sc.nextInt();
    sc.nextLine();

    String[][] map = Produce();

    //测试代码
    for(int i = 0; i < n; i++){
        for(int j = 0; j < n; j++){
            System.out.print(map[i][j]);
        }
        System.out.println();
    }

    //得到"A"的坐标,"B"的坐标
    int[] a = Local(map, "A");
    int[] b = Local(map, "B");

    //测试坐标是否正确
    System.out.println(a[0] + "   " + a[1]);
    System.out.println(b[0] + "   " + b[1]);

    //开始移动
    Move(map, a, b, 0);

    System.out.println("=========================");
    for(int i = 0; i < list.size(); i++){
        System.out.println(list.get(i));
    }

    System.out.println("end!");
}

private static void Move(String[][] m, int[] a, int[] b, int s) {
    //用于记录走过的步数
    int sum = s;        
    String[][] map = m;
    //表示当前坐标
    int[] local = a;
    //表示终点坐标
    int[] end = b;

    MoveUp(map, local, end, sum);
    System.out.println(flag);
    //判断上一步是否到达了终点
    if(flag){
        //加入List集合,然后初始化,接着其他方案
        list.add(sum+1);
        flag = false;
    }

    //重新赋值
    sum = s;        
    map = m;
    local = a;
    end = b;            
    MoveRight(map, local, end, sum);
    System.out.println(flag);
    if(flag){
        //加入List集合,然后初始化,接着其他方案
        list.add(sum+1);
        flag = false;
    }

    //重新赋值
    sum = s;        
    map = m;
    local = a;
    end = b;
    MoveDown(map, local, end, sum);
    System.out.println(flag);
    if(flag){
        //加入List集合,然后初始化,接着其他方案
        list.add(sum+1);
        flag = false;
    }

    //重新赋值
    sum = s;        
    map = m;
    local = a;
    end = b;
    MoveLeft(map, local, end, sum);
    System.out.println(flag);
    if(flag){
        //加入List集合,然后初始化,接着其他方案
        list.add(sum+1);
        flag = false;
    }

}

private static void MoveLeft(String[][] map, int[] local, int[] end, int sum) {

// //重新定义,用于保护现场,避免下一次走错
// String[][] map = m;
// int[] local = a;
// int[] end = b;
// int sum = s;

    //首先判断当前的坐标能不能向左移动
    if(local[1] != 0){
        //判断是否到了终点
        if((local[0] == end[0]) && (local[1]-1 == end[1])){
            //设置到达了终点
            flag = true;
            return;
        }
        else{
            if(map[local[0]][local[1]].equals("A")){
                //把当前位置置为空,避免下一次重复走
                map[local[0]][local[1]] = " ";
                //改变坐标
                local[1]--;
                sum++;//步数加1
                //调用Move函数,接着往下走
                Move(map, local, end, sum);
            }
            else if(map[local[0]][local[1]].equals("+") && 
                    map[local[0]][local[1]-1].equals("-")){
                //把当前位置置为空,避免下一次重复走
                map[local[0]][local[1]] = " ";
                //改变坐标
                local[1]--;
                sum++;//步数加1
                //调用Move函数,接着往下走
                Move(map, local, end, sum);
            }
            else if(map[local[0]][local[1]].equals("-") && 
                    map[local[0]][local[1]-1].equals("+")){
                //把当前位置置为空,避免下一次重复走
                map[local[0]][local[1]] = " ";
                //改变坐标
                local[1]--;
                sum++;//步数加1
                //调用Move函数,接着往下走
                Move(map, local, end, sum);
            }
        }
    }

}

private static void MoveDown(String[][] map, int[] local, int[] end, int sum) {

// //重新定义,用于保护现场,避免下一次走错
// String[][] map = m;
// int[] local = a;
// int[] end = b;
// int sum = s;

    //首先判断当前的坐标能不能向下移动
    if(local[0] != n-1){
        //判断是否到了终点
        if((local[0]+1 == end[0]) && (local[1] == end[1])){
            //设置到达了终点
            flag = true;
            return;
        }
        else{
            if(map[local[0]][local[1]].equals("A")){
                //把当前位置置为空,避免下一次重复走
                map[local[0]][local[1]] = " ";
                //改变坐标
                local[0]++;
                sum++;//步数加1
                //调用Move函数,接着往下走
                Move(map, local, end, sum);
            }
            else if(map[local[0]][local[1]].equals("+") && 
                    map[local[0]+1][local[1]].equals("-")){
                //把当前位置置为空,避免下一次重复走
                map[local[0]][local[1]] = " ";
                //改变坐标
                local[0]++;
                sum++;//步数加1
                //调用Move函数,接着往下走
                Move(map, local, end, sum);
            }
            else if(map[local[0]][local[1]].equals("-") && 
                    map[local[0]+1][local[1]].equals("+")){
                //把当前位置置为空,避免下一次重复走
                map[local[0]][local[1]] = " ";
                //改变坐标
                local[0]++;
                sum++;//步数加1
                //调用Move函数,接着往下走
                Move(map, local, end, sum);
            }
        }
    }

}

private static void MoveRight(String[][] map, int[] local, int[] end, int sum) {

// //重新定义,用于保护现场,避免下一次走错
// String[][] map = m;
// int[] local = a;
// int[] end = b;
// int sum = s;

    //首先判断当前的坐标能不能向右移动
    if(local[1] != n-1){
        //判断是否到了终点
        if((local[0] == end[0]) && (local[1]+1 == end[1])){
            //设置到达了终点
            flag = true;
            return;
        }
        else{
            if(map[local[0]][local[1]].equals("A")){
                map[local[0]][local[1]] = " ";
                //改变坐标
                local[1]++;
                sum++;//步数加1
                //调用Move函数,接着往下走
                Move(map, local, end, sum);
            }
            else if(map[local[0]][local[1]].equals("+") && 
                    map[local[0]][local[1]+1].equals("-")){
                //把当前位置置为空,避免下一次重复走
                map[local[0]][local[1]] = " ";
                //改变坐标
                local[1]++;
                sum++;//步数加1
                //调用Move函数,接着往下走
                Move(map, local, end, sum);
            }
            else if(map[local[0]][local[1]].equals("-") && 
                    map[local[0]][local[1]+1].equals("+")){
                //把当前位置置为空,避免下一次重复走
                map[local[0]][local[1]] = " ";
                //改变坐标
                local[1]++;
                sum++;//步数加1
                //调用Move函数,接着往下走
                Move(map, local, end, sum);
            }
        }
    }

}

private static void MoveUp(String[][] map, int[] local, int[] end, int sum) {

// //重新定义,用于保护现场,避免下一次走错
// String[][] map = m;
// int[] local = a;
// int[] end = b;
// int sum = s;

    //首先判断当前的坐标能不能向上移动
    if(local[0] != 0){
        //判断是否到了终点
        if((local[0]-1 == end[0]) && (local[1] == end[1])){
            //设置到达了终点
            flag = true;
            return;
        }
        else{
            if(map[local[0]][local[1]].equals("A")){
                //把当前位置置为空,避免下一次重复走
                map[local[0]][local[1]] = " ";
                //改变坐标
                local[0]--;
                sum++;//步数加1
                //调用Move函数,接着往下走
                Move(map, local, end, sum);
            }
            else if(map[local[0]][local[1]].equals("+") && 
                    map[local[0]-1][local[1]].equals("-")){
                //把当前位置置为空,避免下一次重复走
                map[local[0]][local[1]] = " ";
                //改变坐标
                local[0]--;
                sum++;//步数加1
                //调用Move函数,接着往下走
                Move(map, local, end, sum);
            }
            else if(map[local[0]][local[1]].equals("-") && 
                    map[local[0]-1][local[1]].equals("+")){
                //把当前位置置为空,避免下一次重复走
                map[local[0]][local[1]] = " ";
                //改变坐标
                local[0]--;
                sum++;//步数加1
                //调用Move函数,接着往下走
                Move(map, local, end, sum);
            }
        }
    }

}

//得到str的坐标
private static int[] Local(String[][] map, String str) {
    int[] local = new int[2];
    for(int i = 0; i < n; i++){
        for(int j = 0; j < n; j++){
            if(map[i][j].equals(str)){
                local[0] = i;
                local[1] = j;
                return local;
            }
        }
    }

    return local;
}

//产生一个n*n的阵列
private static String[][] Produce(){
    Scanner sc = new Scanner(System.in);
    String[] m = new String[n];
    String[][] map = new String[n][n];

    //控制台输入
    for(int i = 0; i < n; i++){
        m[i] = sc.nextLine();
    }

    //对输入的数据进行转换成去掉空格的
    for(int i = 0; i < n; i++){
        map[i] = m[i].split(" ");
    }

    return map;
}

}

  • 写回答

1条回答

  • threenewbee 2015-06-01 01:51
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器