# 迷宫求解（循环，java）



//栈的节点的类
class stack {
private int x = 0;//横纵坐标
private int y = 0;
private stack next = null;//尾指针
private int front = 0;
//front用于记录走过了几个方向，1 代表走过一个方向，2 代表走过两个......
stack(int x, int y){
this.x = x;
this.y = y;
}
void setFront(int i) {
front = i;
}
int getFront() {
return front;
}
int getX() {
return x;
}
int getY() {
return y;
}
void setNext(stack next) {
this.next = next;
}
stack getNext() {
return next;
}
void print() {//打印坐标
System.out.printf("(%d, %d), ",x, y);
}
}
public class maze {
//对一些数值进行初始化
static int row = 0;
static int col = 0;
static int x = 0;
static int y = 0;
//栈底
static stack head = new stack(0,0);
static stack now = null;
static stack top = head;
//初始化迷宫
static int[][] map = {{1,1,1,1,1,1,1,1,1,1},//0
{1,0,0,1,0,0,0,1,0,1},//1
{1,0,0,1,0,0,0,1,0,1},//2
{1,0,0,0,0,1,1,0,0,1},//3
{1,0,1,1,1,0,0,0,0,1},//4
{1,0,0,0,1,0,0,0,0,1},//5
{1,0,1,0,0,0,1,0,0,1},//6
{1,0,1,1,1,0,1,1,0,1},//7
{1,1,0,0,0,0,0,0,2,1},//8
{1,1,1,1,1,1,1,1,1,1},//9
};

static boolean[][] isBy = new boolean[10][10];//设置标记位

public static void main(String[] da) {
//初始化标记
for(int i = 0; i < 9; i++)
for(int j = 0; j < 9; j++)
isBy[i][j] = false;//将标记位全部初始化为未走过

boolean result = search(1,1);//寻找路径
System.out.println(result);
}
public static boolean search(int x, int y) {
stack temp = null;//定义一个节点
do {
if (map[x][y] != 1 && !isBy[x][y]) {//如果当前位置不是墙且没走过
isBy[x][y] = true;//将当前位置置为走过
temp = new stack(x, y);
push(head, temp);//入栈
if( map[x][y] == 2) {//如果到了终点，打印地图，返回true
printRoad(head);
return true;
}
y += 1;//默认从左向右走
temp.setFront(temp.getFront()+1);//将方向设置为1，表示已经从左向右走过
}
else {//如果位置是墙或者是走过的坐标
while(top.getFront() == 4 && !isEmpty()) {//上一步的坐标，如果四个方向都走过且都不通，则出将上一步栈
pop(head);
}
if(top.getFront() < 4) {//上一步坐标，四个方向中有没有走过的方向，则换个方向继续探寻
//此坐标不通，将x, y重置为上一步的坐标
x = top.getX();
y = top.getY();
switch(top.getFront()) {
case 1: x += 1;break;//向下走
case 2: y -= 1;break;//向左走
case 3: x -= 1;break;//向上走
default:;
}
top.setFront(top.getFront() + 1);//将front + 1表示又试探了一个方向
}
}
} while(!isEmpty());
return false;
}
static boolean isEmpty() {//判断栈是否为空
if(head.getNext() == null)return true;
else return false;
}
static void printRoad(stack in) {//循环打印路径
while(in!=null) {
in.print();
in = in.getNext();
}
}
static void push(stack in, stack now) {//入栈
while(in.getNext()!=null)
in = in.getNext();
in.setNext(now);
top = now;
}
static void pop(stack in) {//出栈
stack front = in.getNext();
while(front.getNext()!=null) {
in = front;
front = front.getNext();
}
in.setNext(null);
top = in;
}
}
`

• 点赞
• 评论
• 分享
x

海报分享

扫一扫，分享海报

• 收藏
• 打赏

打赏

java再爱我一次

你的鼓励将是我创作的最大动力

C币 余额
2C币 4C币 6C币 10C币 20C币 50C币
• 举报
• 一键三连

点赞Mark关注该博主, 随时了解TA的最新博文
04-29 2475

09-18 3793
02-04 2478
01-06 218
04-23 237
05-05 209
05-02 693
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客