//迷宫用数组表示
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];
}
}