7-7 求解迷宫从入口到出口的路径 (15 分) java

求解迷宫从入口到出口的路径。输入一个迷宫,求从入口通向出口的可行路径。为简化问题,迷宫用二维数组 int maze[10][10]来存储障碍物的分布,假设迷宫的横向和纵向尺寸的大小是一样的,并由程序运行读入, 若读入迷宫大小的值是n(3<n<=10),则该迷宫横向或纵向尺寸都是n,规定迷宫最外面的一圈是障碍物,迷宫的入口是maze[1][1],出口是maze[n-2][n-2], 若maze[i][j] = 1代表该位置是障碍物,若maze[i][j] = 0代表该位置是可以行走的空位(0<=i<=n-1, 0<=j<=n-1)。求从入口maze[1][1]到出口maze[n-2][n-2]可以走通的路径。要求迷宫中只允许在水平或上下四个方向的空位上行走,走过的位置不能重复走,规定必须按向右、向下、向左、向上的顺序向前搜索试探。 如下这样一个迷宫:

dddd.png

对应的二维数组表示: int maze[10][10]={ {1,1,1,1,1,1,1,1,1,1}, {1,0,0,1,0,0,0,1,0,1}, {1,0,0,1,0,0,0,1,0,1}, {1,0,0,0,0,1,1,0,0,1}, {1,0,1,1,1,0,0,0,1,1}, {1,0,0,0,1,0,0,0,1,1}, {1,0,1,0,0,0,1,0,0,1}, {1,1,1,1,0,1,1,0,1,1}, {1,0,0,0,0,0,0,0,0,1}, {1,1,1,1,1,1,1,1,1,1}};

输入格式:

输入迷宫大小的整数n, 以及n行和n列的二维数组(数组元素1代表障碍物,0代表空位)。

输出格式:

依次输出从入口到出口可行路径每个位置的行列下标(i,j),每个位置间用“,”分隔。若没有通路,输出:NO。

输入样例1:

4
1 1 1 1
1 0 1 1
1 0 0 1
1 1 1 1

结尾无空行

输出样例1:

(1,1)(2,1)(2,2)

结尾无空行

输入样例2:

10
1 1 1 1 1 1 1 1 1 1
1 0 0 1 0 0 0 1 0 1
1 0 0 1 0 0 0 1 0 1
1 0 0 0 0 1 1 0 0 1
1 0 1 1 1 0 0 0 0 1
1 0 0 0 1 0 0 0 0 1
1 0 1 0 0 0 1 0 0 1
1 0 1 1 1 0 1 1 0 1
1 1 0 0 0 0 0 0 0 1
1 1 1 1 1 1 1 1 1 1

结尾无空行

输出样例2:

(1,1)(1,2)(2,2)(3,2)(3,1)(4,1)(5,1)(5,2)(5,3)(6,3)(6,4)(6,5)(7,5)(8,5)(8,6)(8,7)(8,8)

结尾无空行

 


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

public class Main {
    public static void main(String[] args) {
    // write your code here
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt(),i,j;
        int mg[][]=new int[n][n];
        Maze m=new Maze(n);
        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
            {
                mg[i][j]=sc.nextInt();
            }
        }
        m.create(mg);
      if(m.mgth(1,1,n-2,n-2))
          m.out();
      else
          System.out.println("NO");
    }
}

class Box {
    int i,j,k;
    public Box(int i,int j,int k){
        this.i=i;
        this.j=j;

    }
}


class Maze {
    ArrayList<Box> arr=new ArrayList<Box>();
    int n;
    int mg[][];
    public Maze(){}
    public Maze(int n)
    {
        this.n=n;
        mg=new int[n][n];
    }

    public void create(int a[][]){
        int i=0,j=0;
        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
                mg[i][j]=a[i][j];
        }
    }

    public Boolean mgth(int xi,int yi,int xe,int ye)
    {
        int i=0,j=0,k = -1,i1=0,j1=0;
        Box box,e;
        boolean find;
        Stack<Box> st=new Stack<Box>();
        st.push(new Box(xi,yi,-1));
        mg[xi][yi]=-1;
        while(!st.empty()) {
            k = -1;
            box = st.peek();
            i = box.i;
            j = box.j;
            k = box.k;
            if (i == xe && j == ye) {
                while (!st.empty()) {
                    e = st.pop();
                    arr.add(e);
                }
                return true;
            }


            find = false;
            while (k < 3 && !find) {
                k++;
                if (k == 3){ i1 = i;
                j1 = j - 1;}
                else if (k == 0) {i1 = i - 1;
                j1 = j;}
                else if (k == 1){ i1 = i;
                j1 = j + 1;}
                else if (k == 2) {i1 = i + 1;
                j1 = j;}
                if (mg[i1][j1] == 0)
                    find = true;
            }

            if (find) {
                e = st.pop();
                e.k = k;
                st.push(e);
                st.push(new Box(i1, j1, -1));
                mg[i1][j1] = -1;
            } else {
                mg[i][j] = 0;
                st.pop();
            }
        }
        return false;
    }

    public void out(){
        int i=0;
        for(i=arr.size()-1;i>=0;i--)
            System.out.print("("+arr.get(i).i+","+arr.get(i).j+")");
    }
}
 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值