用栈实现迷宫问题

 public class Queue {

        class Box{

               public  int i,j;    //代表行,列

                public int pre;   //前驱的下标

        }

        Box data[] =new Box[100];

        int front;   //标识rear的前驱节点,表示此时正在便利的节点

        int rear;    //表示此时正在生成的节点

        //构造方法

          Queue(){

                //初始化数组

                for(int i=0;i<data.length;i++){

                        data[i]=new Box();

                }

               front =-1;   ///初始化为-1

                rear=-1;     //初始化为-1                

       }

        //将可走的路径按照左,上,右,下,依次加入队列

        //xi,yi是入口坐标  ,xe,ye是出口坐标

         public void mgpath(int xi,int yi,int xe,int ye,Queue q,int mg[][]){

                //定义遍历的变量

                int i,j,di;

                boolean find=false;        //指没有找到出口位置

                q.rear=q.rear+1;

                 System.out.println(q.rear+""+xi+"");

                //将出口坐标加入进队列

                q.data[q.rear].i=xi;

                q.data[q.rear].j=yi;

                 q.data[q.rear].pre=-1;     //此时将出口节点的前驱设置成-1

                //此时xi,yi为出口位置

                mg[xi][yi]=-1;   //-1表示可以通行,但是已经入队 由原来的0变为-1

                while(q.front!=q.rear&&!find){   //当front=rear相等时,表明没有需要入栈的队列,因为下一步front将++此时将超过rear

                        q.front++;

                         i=q.data[q.front].i;

                        j=q.data[q.front].j;

                        if(i==xe && j=ye){ //若此时遍历到出口

                                find=ture;

                                print(q,q.front,mg);     //逆向出列+打印

                                break; //最后不要忘记跳出循环

                        }

                        for(di=0;di<4;di++){

                                switch(di){

                                       case 0:   //代表当前遍历位置的左边

                                              i=q.data[q.front].i;

`                                            j=q.data[q.front].j-1        

                                             break;

                                     case 1:  //代表当前遍历位置的上边

                                              i=q.data[q.front].i-1;

                                              j=q.data[q.front].j;

                                                break;

                                      case 2:  //代表当前遍历位置的右边

                                               i=q.data[q.front].i;

                                               j=q.data[q.front].j+1;

                                                break;

                                        case 3:   //代表当前遍历位置的下边

                                                i=q.data[front].i+1;

                                                j=q.data[q.front].j;

                                                break;

                        }

                        if(mg[i][j]==0){    //表明此时该路径可以通行

                                        q.rear++;  //此时需要将该节点入队列

                                        q.data[q.rear].i=i;

                                        q.data[q.rear].j=j;

                                        q.data[q.rear].pre=q.front;     //前驱节点

                                        mg[i][j]=-1;   //将已经入队的位置变为-1,防止重复入队

                        }

                }

                }

                void  print(Queue q,int front,int mg[][]){

                        int k=front,j,ns=0;

                        System.out.prinln();

                        do{  //首先先反向遍历

                                j=k;

                                k=q.data[k].pre;

                                q.data[j].pre=-1;

                        }while(k!=0);

                        System.out.println("迷宫路径如下:");

                        k=0;

                                if(q.data[k].pre==-1){

                                        ns++;

                                        System.out.println(q.data[k].i+" "+q.data[k].j+"       ");

                        //把绝对路径设置为8
                        mg[q.data[k].i][q.data[k].j]=8;
                        if(ns%5==0){
                            System.out.println();
                          }

                                }

                }

                

        }

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值