#include<iostream>
using namespace std;
const int M = 10, N = 10;
int mg[M+1][N+1]={ /*M=10,N=10*/
{1,1,1,1,1,1,1,1,1,1},
{1,0,0,1,0,0,0,1,0,1},
{1,0,0,1,0,0,0,1,0,1},
{1,0,0,0,0,1,1,0,0,1},
{1,0,1,1,1,0,0,0,0,1},
{1,0,0,0,1,0,0,0,0,1},
{1,0,1,0,0,0,1,0,0,1},
{1,0,1,1,1,0,1,1,0,1},
{1,1,0,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1}};
const MaxSize = 200;
struct
{
int i,j; /*方块的位置*/
int pre; /*本路径中上一方块在Qu中的下标*/
} Qu[MaxSize];
int front=-1,rear=-1; /*队首指针和队尾指针*/
//(1)首先将(1,1)入队;
//(2)在队列Qu不为空时循环:出队一次(由于不是环形队列,该出队元素仍在队列中),称该出队的方块为当前方块,front为该方块在Qu中的下标。
// ①如果当前方块是出口,则输出路径并结束。
// ②否则,按顺时针方向找出当前方块的四个方位中可走的相邻方块(对应的mg数组值为0),将这些可走的相邻方块均插入到队列Qu中,其pre设置为本搜索路径中上一方块在Qu中的下标值,也就是当前方块的front值,并将相邻方块对应的mg数组值置为-1,以避免回过来重复搜索。
//(3)若队列为空仍未找到出口,即不存在路径。
void mgpath()
{
cout << "start...";
++rear;
Qu[rear].i = 1; Qu[rear].j = 1; Qu[rear].pre = -1;
int i, j;
bool find = false;
while (front <= rear && !find)
{
++front;
if (Qu[front].i == M-2 && Qu[front].j == N-2)
{
find = true;
cout << front;
int tmp = front;
while (tmp != -1)
{
cout << " ";
cout << Qu[tmp].i << "," << Qu[tmp].j;
tmp = Qu[tmp].pre;
}
return;
}
int dir = 0;
while (dir < 4)
{
switch (dir)
{
case 0:
i = Qu[front].i-1; j = Qu[front].j;
break;
case 1:
i = Qu[front].i; j = Qu[front].j+1;
break;
case 2:
i = Qu[front].i+1; j = Qu[front].j;
break;
case 3:
i = Qu[front].i; j = Qu[front].j-1;
break;
}
if (mg[i][j] == 0)
{
++rear;
Qu[rear].i = i; Qu[rear].j = j; Qu[rear].pre = front;
mg[i][j] = -1;
}
++dir;
}
}
cout << "err";
}
int main()
{
mgpath();
return 0;
}
const MaxSize = 100;
struct
{
int i; /*当前方块的行号*/
int j; /*当前方块的列号*/
int di; /*di是下一可走相邻方位的方位号*/
} Stack[MaxSize]; /*定义栈*/
int top=-1; /*初始化栈指针*/
void mgpath() /*路径为:(1,1)->(M-2,N-2)*/
{
int i,j,di,find,k;
top++; /*初始方块进栈*/
Stack[top].i=1;Stack[top].j=1;Stack[top].di=-1;mg[1][1]=-1;
while (top>-1) /*栈不空时循环*/
{
i=Stack[top].i;j=Stack[top].j;di=Stack[top].di;
if (i==M-2 && j==N-2) /*找到了出口,输出路径*/
{ printf("迷宫路径如下:\n");
for (k=0;k<=top;k++)
{
printf("\t(%d,%d)",Stack[k].i,Stack[k].j);
if ((k+1)%5==0)
printf("\n");
}
}
printf("\n");
return;
find=0;
while (di<4 && find==0) /*找下一个可走方块*/
{
di++;
switch(di)
{
case 0:i=Stack[top].i-1;j=Stack[top].j;break;
case 1:i=Stack[top].i;j=Stack[top].j+1;break;
case 2:i=Stack[top].i+1;j=Stack[top].j;break;
case 3:i=Stack[top].i,j=Stack[top].j-1;break;
}
if (mg[i][j]==0) find=1;
}
if (find==1) /*找到了下一个可走方块*/
{
Stack[top].di=di; /*修改原栈顶元素的di值*/
top++; /*下一个可走方块进栈*/
Stack[top].i=i;Stack[top].j=j;Stack[top].di=-1;
mg[i][j]=-1; /*避免重复走到该方块*/
}
else /*没有路径可走,则退栈*/
{
mg[Stack[top].i][Stack[top].j]=0;
/*让该位置变为其他路径可走方块*/
top--;
}
}
printf("没有可走路径!\n");
}