您的位置:首页 > 编程语言 > C语言/C++

C语言 迷宫(栈实现)

2014-02-13 10:47 162 查看
Problem I:**迷宫(全部代码自己编写)

Description

编写一个程序求解迷宫问题。迷宫是一个n行m列的矩阵,其中'0'表示无障碍,'1'表示有障碍。设入口为(1,1),出口为(n,m),每次移动只能从一个无障碍的单元移到其周围4个方向上任一无障碍的单元。若该迷宫存在一条从入口到出口的路径,则输出"yes";否则输出"no"。

算法可参考课本50页

Input

每组输入数据中,第1行为迷宫的行数n和列数m(0 < n<=50,0< m<=50),接下来n行,每行包括m个字符,其中'0'表示无障碍,'1'表示有障碍,输入数据中只有这两种字符。

Output

若该迷宫存在一条从入口到出口的路径,则输出"yes";否则输出"no"。

Sample Input

本题系统测试样例并不止以下两例

第一组输入

4 5

00100

00100

00001

01100

第一组输出

yes

第二组输入

3 5

00100

00001

01110

第二组输出

no

Sample Output

#include "stdio.h"

#include "malloc.h"

#define OK 1

#define ERROR 0

#define TRUE 1

#define FALSE 0

typedef int Status;

typedef int SElemType;

typedef struct SNode

{

SElemType load1;//坐标i

SElemType load2;//坐标j

SElemType qq;//a[i][j] 的下一个方向

struct SNode *next;

}SNode,*LinkStackPtr;

typedef struct LinkStack

{

LinkStackPtr top;

int count;

}LinkStack,* LStack;

void InitStack(LStack &S)

//构造一个空栈

{

S = (LStack) malloc (sizeof (LinkStack));

S->top = NULL;

S->count = 0;

}

Status Push(LStack &S,SElemType e1,SElemType e2,SElemType e3)//进栈

//插入元素e为新的栈顶元素

{

LinkStackPtr p;

p = (LinkStackPtr) malloc (sizeof (SNode));

if(!p)

return ERROR;

p->load1 = e1;

p->load2 = e2;

p->qq = e3;

p->next = S->top;

S->top = p;

S->count++;

return OK;

}

Status Pop(LStack &S,SElemType &e1,SElemType &e2,SElemType &e3)//出栈

//若栈不为空,删除S的栈顶元素,用e返回其值,并返回OK,否则返回ERROR

{

LinkStackPtr p;

if(!S->top)

return ERROR;

e1 = S->top->load1;

e2 = S->top->load2;

e3 = S->top->qq;

p = S->top;

S->top = S->top->next;

free(p);

S->count--;

return OK;

}

Status GetTop1(LStack &S,SElemType &e1,SElemType &e2,SElemType &e3)//出栈

//若栈不为空,获取S的栈顶元素,用e返回其值,并返回OK,否则返回ERROR

{

if(!S->top)

return ERROR;

e1 = S->top->load1;

e2 = S->top->load2;

e3 = S->top->qq;

return OK;

}

void StackPrint(LStack S)

//从栈顶到栈底依次打印元素

{

LinkStackPtr p;

p=S->top;

if (p==NULL)

{

printf("NULL\n");

return ;

}

while(p != NULL)

{

printf("%d %d %d\n",p->load1,p->load2,p->qq);

p=p->next;

}

printf("\n");

}

int ChaZhao(LStack &S,SElemType e1,SElemType e2)//查找e1 e2 是否在栈中

{

LinkStackPtr p;

p=S->top;

if (p==NULL)

{

printf("NULL\n");

return ERROR;

}

while(p != NULL)

{

if(p->load1 == e1 && p->load2 == e2)

return OK;

p=p->next;

}

return ERROR;

}

int main()

{

LStack S;

int n,m,i,j,a[52][52];

int q1,q2,q3;

char c[52];

InitStack(S);

scanf("%d%d ",&n,&m);

c[m]='\0';

for(i=0; i<n; i++)

{

gets(c);

for(j=0; j<m; j++)

a[i][j] = c[j]-'0';

}

if(a[0][0] == 1)

{

printf("no\n");

return 0;

}

Push(S,0,0,1);

GetTop1(S,q1,q2,q3);

while(1)

{

if(q3 == 1)

{

if(a[q1][q2+1] == 0 && q2+1<m && !ChaZhao(S,q1,q2+1))

Push(S,q1,q2+1,1);

else

{

Pop(S,q1,q2,q3);

Push(S,q1,q2,q3+1);

}

}

else if (q3 == 2)

{

if(a[q1+1][q2] == 0 && q1+1<n && !ChaZhao(S,q1+1,q2))

Push(S,q1+1,q2,1);

else

{

Pop(S,q1,q2,q3);

Push(S,q1,q2,q3+1);

}

}

else if (q3 == 3)

{

if(a[q1][q2-1] == 0 && q2-1>=0 && !ChaZhao(S,q1,q2-1))

Push(S,q1,q2-1,1);

else

{

Pop(S,q1,q2,q3);

Push(S,q1,q2,q3+1);

}

}

else

{

if(a[q1-1][q2] == 0 && q1-1>=0 && !ChaZhao(S,q1-1,q2))

Push(S,q1-1,q2,1);

else

{

Pop(S,q1,q2,q3);

if(q1 ==0 && q2 ==0 && q3 == 4)

break;

else

a[q1][q2] = 1;

}

}

GetTop1(S,q1,q2,q3);

if((q1 == n-1 && q2 == m-1) || (q1 ==0 && q2 ==0 && q3 == 5))

break;

}

if(q1 == n-1 && q2 == m-1)

printf("yes\n");

else

printf("no\n");

return 0;

}

思路是借鉴书上的,,,理清一下,,就可以实现简单的迷宫了,,,这里的入口在(1,1),出口在(n,m),,,可能不存在出口或入口,,,路径的话,,想看到的话,,,也可以自己尝试修改一些就能打印出来了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: