您的位置:首页 > 其它

解决迷宫问题, 栈和队列

2012-05-07 12:53 453 查看
#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");

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  struct