不是我写的,好好学习一下
研究了一下,觉得是这样
1。 这个栈S1用来保存到这个点所最近一次查找过的方向信息。
所以每个点第一次入栈时方向都是-1,表示这个点还没有进行过搜索。
而每个点出栈后,d都要加一,表示我们要去找这个点的下一个方向。
2。 栈S1里面保存的就是搜索的路径。
根据代码中的这个算法,我们遇到一个可以往下找的点时,会将当前的点入栈。 然后以找到的新点为起点。
所以,当我们进入下一次的循环后,栈S1的栈顶元素就是这次查找路径到达本点的上一个点。
以此类推,栈顶的第二个元素就是第一个元素的前继。
ok,那么栈的元素,就是这次查找的路径。
/*
* =====================================================================================
*
* Filename: maze.c
*
* Description:
*
* Version: 1.0
* Created: 09/26/2010 07:20:53 AM
* Revision: none
* Compiler: gcc
*
* Author: YOUR NAME (),
* Company:
*
* =====================================================================================
*/
#include<stdio.h>
#include<stdlib.h>
#define M 16
#define N 16
typedef struct mark//¶šÒåÃÔ¹¬ÄÚµãµÄ×ø±êÀàÐÍ
{
int x;
int y;
}mark;
typedef struct Element//"Áµ"Õ»ÔªËØ£¬ºÙºÙ¡£¡£
{
int x,y; //xÐÐ,yÁÐ
int d; //dÏÂÒ»²œµÄ·œÏò
}Element;
typedef struct LStack //ÁŽÕ»
{
Element elem;
struct LStack *next;
}LStack, *PLStack;
/*************Õ»º¯Êý****************/
int InitStack(PLStack &S)//¹¹Ôì¿ÕÕ»
{
S=NULL;
return 1;
}
int StackEmpty(PLStack S)//ÅжÏÕ»ÊÇ·ñΪ¿Õ
{
if(S==NULL)
return 1;
else
return 0;
}
int Push(PLStack &S, Element e)//ѹÈëÐÂÊýŸÝÔªËØ
{
PLStack p;
p=(PLStack)malloc(sizeof(LStack));
p->elem=e;
p->next=S;
S=p;
return 1;
}
int Pop(PLStack &S,Element &e) //Õ»¶¥ÔªËسöÕ»
{
PLStack p;
if(!StackEmpty(S))
{
e=S->elem;
p=S;
S=S->next;
free(p);
return 1;
}
else
return 0;
}
/***************ÇóÃÔ¹¬Â·Ÿ¶º¯Êý***********************/
void MazePath(struct mark start,struct mark end,int maze[M][N],int diradd[4][2])
{
int i,j,d;int a,b;
Element elem,e;
PLStack S1, S2;
InitStack(S1);
InitStack(S2);
maze[start.x][start.y]=2; //Èë¿Úµã×÷ÉϱêŒÇ
elem.x=start.x;
elem.y=start.y;
elem.d=-1; //¿ªÊŒÎª-1
Push(S1,elem);
while(!StackEmpty(S1)) //Õ»²»Îª¿Õ ÓзŸ¶¿É×ß
{
Pop(S1,elem);
i=elem.x;
j=elem.y;
d=elem.d+1; //ÏÂÒ»žö·œÏò
while(d<4) //ÊÔÌœ¶«ÄÏÎ÷±±ž÷žö·œÏò
{
a=i+diradd[d][0];
b=j+diradd[d][1];
if(a==end.x && b==end.y && maze[a][b]==0) //Èç¹ûµœÁ˳ö¿Ú
{
elem.x=i;
elem.y=j;
elem.d=d;
Push(S1,elem);
elem.x=a;
elem.y=b;
elem.d=886; //·œÏòÊä³öΪ-1 ÅжÏÊÇ·ñµœÁ˳ö¿Ú
Push(S1,elem);
printf("/n0=E 1=S 2=W 3=N 886 means out of maze/n/npath is:(x,y,d)/n");
while(S1) //ÄæÖÃÐòÁÐ ²¢Êä³öÃÔ¹¬Â·Ÿ¶ÐòÁÐ
{
Pop(S1,e);
Push(S2,e);
}
while(S2)
{
Pop(S2,e);
printf("-->(%d,%d,%d)",e.x,e.y,e.d);
}
return; //Ìø³öÁœ²ãÑ»·£¬±ŸÀŽÓÃbreak,µ«·¢ÏÖ³öŽí£¬exitÓÖ»áœáÊø³ÌÐò£¬Ñ¡ÓÃreturn»¹ÊDz»ŽíµÎo(¡É_¡É)o...
}
if(maze[a][b]==0) //ÕÒµœ¿ÉÒÔÇ°œøµÄ·Ç³ö¿ÚµÄµã
{
maze[a][b]=2; //±êŒÇ×ß¹ýŽËµã
elem.x=i;
elem.y=j;
elem.d=d;
Push(S1,elem); //µ±Ç°Î»ÖÃÈëÕ»
i=a; //ÏÂÒ»µãת»¯Îªµ±Ç°µã
j=b;
d=-1;
}
d++;
}
}
printf("no path for this maze/n");
}
/*************œšÁ¢ÃÔ¹¬*******************/
void initmaze(int maze[M][N])
{
int i,j;
int m,n; //ÃÔ¹¬ÐÐ,ÁÐ
printf("column m=");
scanf("%d",&m);
printf("cow n=");
scanf("%d",&n);
printf("/ninput your maze:/nseperate by space,0 path,1 wall/n",m,n);
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
scanf("%d",&maze[i][j]);
printf("creating your maze...o(¡É_¡É)o.../n");
for(i=0;i<=m+1;i++) //ŒÓһȊΧǜ
{
maze[i][0]=1;
maze[i][n+1]=1;
}
for(j=0;j<=n+1;j++)
{
maze[0][j]=1;
maze[m+1][j]=1;
}
for(i=0;i<=m+1;i++) //Êä³öÃÔ¹¬
{
for(j=0;j<=n+1;j++)
printf("%d ",maze[i][j]);
printf("/n");
}
}
int maze[][16] =
{
/*0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 */
/* 0 */{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
/* 1 */{1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
/* 2 */{1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
/* 3 */{1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
/* 4 */{1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1},
/* 5 */{1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1},
/* 6 */{1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1},
/* 7 */{1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1},
/* 8 */{1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1},
/* 9 */{1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1},
/* 10 */{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1},
/* 11 */{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1},
/* 12 */{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1},
/* 13 */{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1},
/* 14 */{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1},
/* 15 */{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}
};
int main()
{
int sto[M][N];
int i,j;
struct mark start,end; //start,endÈë¿ÚºÍ³ö¿ÚµÄ×ø±ê
int add[4][2]={{0,1},{1,0},{0,-1},{-1,0}};//ÐÐÔöÁ¿ºÍÁÐÔöÁ¿ ·œÏòÒÀŽÎΪ¶«Î÷Äϱ±
// initmaze(sto);//œšÁ¢ÃÔ¹¬
for(i=0;i<16;i++) //Êä³öÃÔ¹¬
{
for(j=0;j<16;j++)
printf("%d ",maze[i][j]);
printf("/n");
}
printf("start point, sperate by comma/n");
scanf("%d,%d",&start.x,&start.y);
printf("ent point, sperate by comma/n");
scanf("%d,%d",&end.x,&end.y);
// MazePath(start,end,sto,add); //find path
MazePath(start,end,maze,add); //find path
printf("/n");
}