栈
#include<stdio.h>
#define M 8//行数
#define N 8//列数
#define maxsize 100//栈最多元素个数
int mg[M+2][N+2]={ //一个迷宫,其四周要加上均为1的外框
{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}
};
struct labyrinth
{
int i;//横坐标
int j;//列坐标
int di;//方向
}stack[maxsize],path[maxsize];//存放栈和最短路径的数组
int top=-1;//栈顶指针
int count=1;//路径数
int minlen=maxsize;//最短路径长度
void labypath();
int main()
{
printf("所有路径如下:\n");
labypath();
}
void labypath()
{
int i,j,di,find,l;
top++;
stack[top].i=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&&j==N)
{
printf("M: ",count++);
for(l=0;l<=top;l++)
{printf("(%d,%d) ",stack[l].i,stack[l].j);
if((l+1)%5==0)
printf("\n");}
printf("\n");
if(top+1<minlen)//最短路径
{
for(l=0;l<=top;l++)
path[l]=stack[l];
minlen=top+1;
}
mg[stack[top].i][stack[top].j]=0;//恢复通行
top--;
i=stack[top].i,j=stack[top].j,di=stack[top].di;
}
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;
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");
printf("长度: %d\n",minlen);
printf("路径: ");
for(l=0;l<minlen;l
++){
printf("(%d,%d) ",path[l].i,path[l].j);
if((l+1)%5==0) //输出时每5个结点换一行
printf("\n\t");
}
printf("\n");
}
队列
#include<stdio.h>
#define M 8
#define N 8
#define maxsize 100
int mg[M+2][N+2]=
{
{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}
};
typedef struct
{
int i;//横坐标
int j;//纵坐标
int pre;//本路径中上一方块在该路径中的位置
}box;//方块类型
typedef struct
{
box data[maxsize];//路径坐标
int front,rear;//队头、队尾指针
}QU;
void labyrinth(int xi,int yi,int xe,int ye);
void print(QU qu,int front);
int main()
{
labyrinth(1,1,M,N);
}
void labyrinth(int xi,int yi,int xe,int ye)
{
int i,j,di;
int find=0;
QU qu;
qu.front=qu.rear=-1;
qu.rear++;
qu.data[qu.rear].i=xi;
qu.data[qu.rear].j=yi;
qu.data[qu.rear].pre=-1;
mg[xi][yi]=-1;
while(qu.front!=qu.rear&&!find)//队列非空且未找到路径时
{
qu.front++;
i=qu.data[qu.front].i;
j=qu.data[qu.front].j;
if(i==M&&j==N)//找到路径
{
find=1;
print(qu,qu.front);
}
for(di=0;di<4;di++)
{
switch(di)
{
case 0:
i=qu.data[qu.front].i-1;//上
j=qu.data[qu.front].j;
break;
case 1:
i=qu.data[qu.front].i+1;//下
j=qu.data[qu.front].j;
break;
case 2:
i=qu.data[qu.front].i;//左
j=qu.data[qu.front].j-1;
break;
case 3:
i=qu.data[qu.front].i;//右
j=qu.data[qu.front].j+1;
break;
}
if(mg[i][j]==0)
{
qu.rear++;
qu.data[qu.rear].i=i;
qu.data[qu.rear].j=j;
qu.data[qu.rear].pre=qu.front;
mg[i][j]=-1;
}
}
find=0;
}}
void print(QU qu,int front)
{
int k,j,ns=0;
k=front;
do{
j=k;
k=qu.data[k].pre;
qu.data[j].pre=-1;
}while(k!=0);
printf("迷宫路径如下:\n");
k=0;
while (k<=front) //正向搜索到pre为-1的方块,即构成正向的路径
{
if (qu.data[k].pre==-1)
{
ns++;
printf("\t(%d,%d)",qu.data[k].i,qu.data[k].j);
if (ns%5==0)
printf("\n"); //每输出每5个方块后换一行
}
k++;
}
printf("\n");
}