数据结构之迷宫问题

这里写图片描述

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

这里写图片描述

这里写图片描述

//迷宫用数组表示
public int[][] ditu() {
        int[][] mg = new int[10][10];
        mg[0][0] = 1;
        mg[1][0] = 1;
        mg[2][0] = 1;
        mg[3][0] = 1;
        mg[4][0] = 1;
        mg[5][0] = 1;
        mg[6][0] = 1;
        mg[7][0] = 1;
        mg[8][0] = 1;
        mg[9][0] = 1;

        mg[0][1] = 1;
        mg[1][1] = 0;
        mg[2][1] = 0;
        mg[3][1] = 0;
        mg[4][1] = 0;
        mg[5][1] = 0;
        mg[6][1] = 0;
        mg[7][1] = 0;
        mg[8][1] = 1;
        mg[9][1] = 1;

        mg[0][2] = 1;
        mg[1][2] = 0;
        mg[2][2] = 0;
        mg[3][2] = 0;
        mg[4][2] = 1;
        mg[5][2] = 0;
        mg[6][2] = 1;
        mg[7][2] = 1;
        mg[8][2] = 0;
        mg[9][2] = 1;

        mg[0][3] = 1;
        mg[1][3] = 1;
        mg[2][3] = 1;
        mg[3][3] = 0;
        mg[4][3] = 1;
        mg[5][3] = 0;
        mg[6][3] = 0;
        mg[7][3] = 1;
        mg[8][3] = 0;
        mg[9][3] = 1;

        mg[0][4] = 1;
        mg[1][4] = 0;
        mg[2][4] = 0;
        mg[3][4] = 0;
        mg[4][4] = 1;
        mg[5][4] = 1;
        mg[6][4] = 0;
        mg[7][4] = 1;
        mg[8][4] = 0;
        mg[9][4] = 1;

        mg[0][5] = 1;
        mg[1][5] = 0;
        mg[2][5] = 0;
        mg[3][5] = 1;
        mg[4][5] = 0;
        mg[5][5] = 0;
        mg[6][5] = 0;
        mg[7][5] = 0;
        mg[8][5] = 0;
        mg[9][5] = 1;

        mg[0][6] = 1;
        mg[1][6] = 0;
        mg[2][6] = 0;
        mg[3][6] = 1;
        mg[4][6] = 0;
        mg[5][6] = 0;
        mg[6][6] = 1;
        mg[7][6] = 1;
        mg[8][6] = 0;
        mg[9][6] = 1;

        mg[0][7] = 1;
        mg[1][7] = 1;
        mg[2][7] = 1;
        mg[3][7] = 0;
        mg[4][7] = 0;
        mg[5][7] = 0;
        mg[6][7] = 0;
        mg[7][7] = 1;
        mg[8][7] = 0;
        mg[9][7] = 1;

        mg[0][8] = 1;
        mg[1][8] = 0;
        mg[2][8] = 0;
        mg[3][8] = 0;
        mg[4][8] = 0;
        mg[5][8] = 0;
        mg[6][8] = 0;
        mg[7][8] = 0;
        mg[8][8] = 0;
        mg[9][8] = 1;

        mg[0][9] = 1;
        mg[1][9] = 1;
        mg[2][9] = 1;
        mg[3][9] = 1;
        mg[4][9] = 1;
        mg[5][9] = 1;
        mg[6][9] = 1;
        mg[7][9] = 1;
        mg[8][9] = 1;
        mg[9][9] = 1;
        return mg;
    }
    //自定义栈
    public class Box {
        int i;
        int j;
        int di;
    }

    public class StYype {

        Box[] data;
        int top;

        public StYype() {
            data = new Box[100];
        }
    }
   //求解路径
   boolean mgpath(int xi, int yi, int xe, int ye) {
        int[][] mg = ditu();
        int i, j, di, find;
        StYype st = new StYype();
        st.top = -1;
        st.top++;
        Box box = new Box();
        box.i = xi;
        box.j = yi;
        box.di = -1;
        st.data[st.top] = box;
        mg[xi][yi] = -1; //每一个入栈的元素的值都设为-1,防止行走
        while (st.top > -1) {
            i = st.data[st.top].i;
            j = st.data[st.top].j;
            di = st.data[st.top].di;
            //找到路径并输出
            if (i == xe && j == ye) {
                System.out.println("迷宫路径如下");
                for (int k = 0; k <= st.top; k++) {
                    System.out.print(st.data[k].i + "," + st.data[k].j+"  ");
                    if ((k + 1) % 5 == 0) {
                        System.out.println();
                    }
                }
                System.out.println();
                return true;
            }
            find = 0;
            //找下一个可以行走的方块
            while (di < 4 && find == 0) {
                di++;
                switch (di) {
                    case 0:
                        i = st.data[st.top].i - 1;
                        j = st.data[st.top].j;
                        break;

                    case 1:
                        i = st.data[st.top].i;
                        j = st.data[st.top].j + 1;
                        break;

                    case 2:
                        i = st.data[st.top].i + 1;
                        j = st.data[st.top].j;
                        break;

                    case 3:
                        i = st.data[st.top].i;
                        j = st.data[st.top].j - 1;
                        break;
                }
                if (mg[i][j] == 0) find = 1;
            }
            if (find == 1) {
                st.data[st.top].di = di;
                st.top++;
                Box box2 = new Box();
                box2.i = i;
                box2.j = j;
                box2.di = -1;
                st.data[st.top] = box2;
                mg[i][j] = -1;
            } else {
                mg[st.data[st.top].i][st.data[st.top].j] = 0;
                st.top--;
            }
        }
        return false;
    }
    //执行、求解
    public static void main(String[] args) {
        migongwenti a = new migongwenti();
        if (!a.mgpath(1, 1,8 ,8 )) System.out.println("没有解");
    }

下面是通过队列的方式求解

   boolean mgpath(int xi, int yi, int xe, int ye) {
        int[][] mg = ditu();
        QuType quType = new QuType();
        int find = 0;
        int i;
        int j;
        quType.front = -1;
        quType.rear = -1;
        Box box = new Box();
        box.pre = -1;
        box.i = xi;
        box.j = yi;
        quType.rear++;
        quType.data[quType.rear] = box;
        mg[xi][yi] = -1;
        while (quType.front != quType.rear) {
            quType.front++;
            i = quType.data[quType.front].i;
            j = quType.data[quType.front].j;
            if (i == xe && j == ye) {
                printlujin(quType, quType.front);
                return true;
            } else {
                for (int di = 0; di < 4; di++) {
                    switch (di) {
                        case 0:
                            i = quType.data[quType.front].i - 1;
                            j = quType.data[quType.front].j;
                            break;
                        case 1:
                            i = quType.data[quType.front].i;
                            j = quType.data[quType.front].j + 1;
                            break;
                        case 2:
                            i = quType.data[quType.front].i + 1;
                            j = quType.data[quType.front].j;
                            break;
                        case 3:
                            i = quType.data[quType.front].i - 1;
                            j = quType.data[quType.front].j - 1;
                            break;

                    }
                    if (mg[i][j] == 0) {
                        quType.rear++;

                        Box box2 = new Box();
                        box2.i = i;
                        box2.j = j;
                        box2.pre = quType.front;
                        quType.data[quType.rear] = box2;
                        mg[i][j] = -1;
                    }
                }
            }


        }
        return false;
    }

    private void printlujin(QuType quType, int front) {
        int pre = quType.data[front].pre;
        System.out.println(quType.data[front].i + " " + quType.data[front].j + "  ");
        int q = 0;
        while (pre != -1) {
            System.out.print(quType.data[pre].i + " " + quType.data[pre].j + "  ");
            pre = quType.data[pre].pre;
            q++;
            if (q % 4 == 0) {
                System.out.println();
            }

        }
    }

    public class Box {
        int i;
        int j;
        int pre;
    }

    public class QuType {
        Box[] data;
        int front;
        int rear;

        public QuType() {
            data = new Box[200];
        }
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值