
这学期老师非得让用C语言写一个栈来解决迷宫可解性的问题,让我们这些学过一些stl的比较难以接受,明明两行就能解决的函数定义非要搞得那么麻烦....
用C语言来写顺栈的话,就是用数组模拟,链栈可以用链表,以链头当栈顶.
话不多说,直接上代码;
顺栈:
#include
#include
#define MAXN 20000
int migong[101][100];
int direction[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
typedef struct{
int x;
int y;
int d;
}date;
struct seq
{
int t;
date s[MAXN];
};
typedef struct seq * pseq;
pseq creat_seq()
{
pseq pseqa;
pseqa=(pseq)malloc(sizeof(seq));
if(pseqa==NULL)
printf("malloc error!\n");
else
pseqa->t=-1;
return pseqa;
}
void push_seq(pseq pseqa,date x)
{
if(pseqa->t>MAXN)
printf("error 2!\n");
else
{
pseqa->t++;
pseqa->s[pseqa->t]=x;
}
}
int empty_seq(pseq pseqa)
{
if(pseqa->t==-1)
return 1;
else
return 0;
}
void pop_seq(pseq pseqa)
{
if(!empty_seq(pseqa))
pseqa->t--;
}
date top_seq(pseq pseq)
{
return pseq->s[pseq->t];
}
int output_seq(pseq pseqa)
{
date n;
if(empty_seq(pseqa))
return 0;
n.x=pseqa->s[pseqa->t].x;
n.y=pseqa->s[pseqa->t].y;
pop_seq(pseqa);
output_seq(pseqa);
printf("(%d %d)",n.x,n.y);
}
int path(int migong[][100],int dirction[][2],int x1,int y1,int x2,int y2,int m,int n,pseq st) //x1,为起点纵坐标,x2为终点的,m行,n列
{
int i,j,k,g,h,b,x0,y0;
date a;
if(st==NULL)
return 0;
migong[x1][y1]=2;
a.x=x1;
a.y=y1;
a.d=-1;
push_seq(st,a);
if(x1==x2&&y1==y2)
return 1;
while(st->t!=-1)
{
a=top_seq(st);
x0=a.x;
y0=a.y;
k=a.d+1;
while(k<=3)
{
g=x0+direction[k][0];
h=y0+direction[k][1];
if(g>=0&&g<=n-1&&h>=0&&h<=m-1&&migong[g][h]==0)
if(path(migong,direction,g,h,x2,y2,m,n,st)==1)
return 1;
k=k+1;
}
pop_seq(st);
}
return 2;
}
int main()
{
int x1,x2,y1,y2,m,n,i,j;
pseq st;
scanf("%d %d",&m,&n);
scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
for(i=0;i<=m-1;i++)
for(j=0;j<=n-1;j++)
{
scanf("%d",&migong[i][j]);
}
st=creat_seq();
if(path(migong,direction,x1,y1,x2,y2,m,n,st)==1)
output_seq(st);
else
printf("No Path!");
return 0;
}
链栈:
#include
#include
#define MAXN 20000
int migong[101][100];
int direction[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
typedef struct{
int x;
int y;
int d;
}date;
struct Node
{
date data;
struct Node *next;
};
typedef struct{
struct Node *top;
}stk;
stk *creat_seq()
{
stk *p=NULL;
p=(stk*)malloc(sizeof(stk));
if(p!=NULL)
p->top=NULL;
else
printf("out of space!\n");
return p;
}
int push_seq(stk *pseqa,date x)
{
struct Node *pnew=NULL;
pnew=(struct Node*)malloc(sizeof(struct Node));
if(pnew!=NULL)
{
pnew->data=x;
pnew->next=pseqa->top;
pseqa->top=pnew;
return 1;
}
printf("out of space!\n");
return 0;
}
int empty_seq(stk *pseqa)
{
if(pseqa->top==NULL)
return 1;
else
return 0;
}
date pop_seq(stk *pseqa)
{
date n;
struct Node *ptemp=NULL;
n=pseqa->top->data;
ptemp=pseqa->top;
pseqa->top=pseqa->top->next;
free(ptemp);
return n;
}
date top_seq(stk *pseq)
{
return pseq->top->data;
}
int output_seq(stk* pseqa)
{
date n;
if(empty_seq(pseqa))
return 0;
n.x=pseqa->top->data.x;
n.y=pseqa->top->data.y;
pop_seq(pseqa);
output_seq(pseqa);
printf("(%d %d)",n.x,n.y);
}
int path(int migong[][100],int dirction[][2],int x1,int y1,int x2,int y2,int m,int n,stk* st) //x1,为起点纵坐标,x2为终点的,m行,n列
{
int i,j,k,g,h,b,x0,y0;
date a;
if(st==NULL)
return 0;
migong[x1][y1]=2;
a.x=x1;
a.y=y1;
a.d=-1;
push_seq(st,a);
if(x1==x2&&y1==y2)
return 1;
while(!empty_seq(st))
{
a=top_seq(st);
x0=a.x;
y0=a.y;
k=a.d+1;
while(k<=3)
{
g=x0+direction[k][0];
h=y0+direction[k][1];
if(g>=0&&g<=n-1&&h>=0&&h<=m-1&&migong[g][h]==0)
if(path(migong,direction,g,h,x2,y2,m,n,st)==1)
return 1;
k=k+1;
}
if(!empty_seq(st))
pop_seq(st);
}
return 2;
}
int main()
{
int x1,x2,y1,y2,m,n,i,j;
stk *st=NULL;
scanf("%d %d",&m,&n);
scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
for(i=0;i<=m-1;i++)
for(j=0;j<=n-1;j++)
{
scanf("%d",&migong[i][j]);
}
st=creat_seq();
if(path(migong,direction,x1,y1,x2,y2,m,n,st)==1)
output_seq(st);
else
printf("No Path!");
return 0;
}
如有雷同,纯属巧合.
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)