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(); }
}
}
}