c语言迷宫问题
#include<stdio.h>#defineSTACK_INIT_SIZE100#defineSTACKINCREMENT10#defineERROR0#define...
#include<stdio.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define ERROR 0
#define OK 1
typedef struct QElemType
{
int x,y;
struct QElemType *parent; //用于寻找上一节点
}
QElemType;
typedef struct QNode
{
QElemType data;
struct QNode *next;
}
QNode,*QueuePtr;
typedef struct
{
QueuePtr front;
QueuePtr rear;
}
LinkQueue;
void InitQueue(LinkQueue *Q)
{
Q->front=Q->rear=(QueuePtr)malloc(sizeof(QNode));
Q->front=Q->rear=NULL;
}
void EnQueue(LinkQueue *Q,QElemType e)
{
QueuePtr p;
p=(QueuePtr)malloc(sizeof(QNode));
p->data=e;
p->next=NULL;
Q->rear->next=p;
Q->rear=p;
}
QElemType DeQueue(LinkQueue *Q)
{
QElemType e;
QueuePtr p;
p=Q->front->next;
e=p->data;
Q->front->next=p->next;
if(Q->rear==p)
Q->rear=Q->front;
free(p);
return (e);
}
int QueueEmpty(LinkQueue *Q)
{
if(Q->front==Q->rear )
return 1;
else
return 0;
}
QElemType NextPos(QElemType e,int i)
{
switch(i)
{
case 1:e.y=e.y+1;break;
case 2:e.x=e.x+1;break;
case 3:e.y=e.y-1;break;
case 4:e.x=e.x-1;break;
}
return (e);
}
QElemType MazePath(int maze[][10],LinkQueue Q)
{
int i;
QElemType e,p;
InitQueue(&Q);
e.x=1;e.y=1;
e.parent=NULL;
EnQueue(&Q,e);
while(!QueueEmpty(&Q))
{
e=DeQueue(&Q);
if(e.x==8&&e.y==8)
return e;
for(i=1;i<=4;i++)
{
p=NextPos(e,i);
if(maze[p.x][p.y]==1)
{
maze[p.x][p.y]=2;
p.parent=&e;
EnQueue(&Q,p);
}
}
}
printf("zhao bu dao");
}
void main()
{
LinkQueue Q;QElemType e,*p;int i,j;
int maze[10][10]=
{{0,0,0,0,0,0,0,0,0,0},
{0,1,1,0,1,1,1,0,1,0},
{0,1,1,0,1,1,1,0,1,0},
{0,1,1,1,1,0,0,1,1,0},
{0,1,0,0,0,1,1,1,1,0},
{0,1,1,1,0,1,1,1,1,0},
{0,1,0,1,1,1,0,1,1,0},
{0,1,0,0,0,1,0,0,1,0},
{0,0,1,1,1,1,1,1,1,0},
{0,0,0,0,0,0,0,0,0,0}
};
InitQueue(&Q);
for (i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
printf("%d,",maze[i][j]);
}
printf("\n");
}
printf("\n");
e=MazePath(maze,Q);
p=&e;
while(p)
{
printf("(%d,%d),",p->x,p->y);
p=p->parent;
}
getch();
}
麻烦帮我看下,就是无法通过出口往回找,不知道那里哪错了,麻烦帮我看下。
是应用队列,相当于求广度优先遍历,找到出口,再往回寻入口,麻烦各位高手帮我看下。 都把全部分数拿出来了啊!!帮帮忙。
怎么没人回答啊??????? 展开
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define ERROR 0
#define OK 1
typedef struct QElemType
{
int x,y;
struct QElemType *parent; //用于寻找上一节点
}
QElemType;
typedef struct QNode
{
QElemType data;
struct QNode *next;
}
QNode,*QueuePtr;
typedef struct
{
QueuePtr front;
QueuePtr rear;
}
LinkQueue;
void InitQueue(LinkQueue *Q)
{
Q->front=Q->rear=(QueuePtr)malloc(sizeof(QNode));
Q->front=Q->rear=NULL;
}
void EnQueue(LinkQueue *Q,QElemType e)
{
QueuePtr p;
p=(QueuePtr)malloc(sizeof(QNode));
p->data=e;
p->next=NULL;
Q->rear->next=p;
Q->rear=p;
}
QElemType DeQueue(LinkQueue *Q)
{
QElemType e;
QueuePtr p;
p=Q->front->next;
e=p->data;
Q->front->next=p->next;
if(Q->rear==p)
Q->rear=Q->front;
free(p);
return (e);
}
int QueueEmpty(LinkQueue *Q)
{
if(Q->front==Q->rear )
return 1;
else
return 0;
}
QElemType NextPos(QElemType e,int i)
{
switch(i)
{
case 1:e.y=e.y+1;break;
case 2:e.x=e.x+1;break;
case 3:e.y=e.y-1;break;
case 4:e.x=e.x-1;break;
}
return (e);
}
QElemType MazePath(int maze[][10],LinkQueue Q)
{
int i;
QElemType e,p;
InitQueue(&Q);
e.x=1;e.y=1;
e.parent=NULL;
EnQueue(&Q,e);
while(!QueueEmpty(&Q))
{
e=DeQueue(&Q);
if(e.x==8&&e.y==8)
return e;
for(i=1;i<=4;i++)
{
p=NextPos(e,i);
if(maze[p.x][p.y]==1)
{
maze[p.x][p.y]=2;
p.parent=&e;
EnQueue(&Q,p);
}
}
}
printf("zhao bu dao");
}
void main()
{
LinkQueue Q;QElemType e,*p;int i,j;
int maze[10][10]=
{{0,0,0,0,0,0,0,0,0,0},
{0,1,1,0,1,1,1,0,1,0},
{0,1,1,0,1,1,1,0,1,0},
{0,1,1,1,1,0,0,1,1,0},
{0,1,0,0,0,1,1,1,1,0},
{0,1,1,1,0,1,1,1,1,0},
{0,1,0,1,1,1,0,1,1,0},
{0,1,0,0,0,1,0,0,1,0},
{0,0,1,1,1,1,1,1,1,0},
{0,0,0,0,0,0,0,0,0,0}
};
InitQueue(&Q);
for (i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
printf("%d,",maze[i][j]);
}
printf("\n");
}
printf("\n");
e=MazePath(maze,Q);
p=&e;
while(p)
{
printf("(%d,%d),",p->x,p->y);
p=p->parent;
}
getch();
}
麻烦帮我看下,就是无法通过出口往回找,不知道那里哪错了,麻烦帮我看下。
是应用队列,相当于求广度优先遍历,找到出口,再往回寻入口,麻烦各位高手帮我看下。 都把全部分数拿出来了啊!!帮帮忙。
怎么没人回答啊??????? 展开
展开全部
问题出在MazePath内部的e是一个局部变量,并且随着while循环其内容不断变化。保存一个局部变量的地址是没有意义的,函数返回后就被清除。解决的办法是动态分配QElemType类型的对象,还有要注意一下,这个程序中分配的内存最后都没有被释放,这可是个不好的编程习惯。
改好了,你自己看看有没有错误。
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct QElemType
{
int x,y;
struct QElemType *parent;//用于存储节点的前一个节点
} QElemType;
typedef struct QNode//队列节点
{
QElemType *data;
struct QNode *next;
} QNode, *QueuePtr;
typedef struct
{
QueuePtr front;
QueuePtr rear;
} LinkQueue;
void InitQueue(LinkQueue *Q)//创建队列
{
Q->front=Q->rear=(QueuePtr)malloc(sizeof(QNode));
Q->rear->next = NULL;
//Q->front=Q->rear=NULL;
}
void EnQueue(LinkQueue *Q, QElemType *e)//将元素入队
{
QueuePtr p;
p=(QueuePtr)malloc(sizeof(QNode));
p->data=e;
p->next=NULL;
Q->rear->next=p;
Q->rear=p;
}
QElemType *DeQueue(LinkQueue *Q)//将元素出对
{
QElemType *e;
QueuePtr p;
p=Q->front->next;
e=p->data;
Q->front->next=p->next;
if(Q->rear==p)
Q->rear=Q->front;
free(p);
return (e);
}
int QueueEmpty(LinkQueue *Q)//判断队列是否为空
{
if(Q->front==Q->rear )
return 1;
else
return 0;
}
QElemType *NextPos(QElemType *e,int i)//节点的下一个位置
{
QElemType *t = (QElemType *)malloc(sizeof(QElemType));
*t = *e;
switch(i)
{
case 1:t->y=t->y+1;break;
case 2:t->x=t->x+1;break;
case 3:t->y=t->y-1;break;
case 4:t->x=t->x-1;break;
}
return (t);
}
QElemType *MazePath(int maze[][10],LinkQueue *Q)//迷宫函数
{
int i;
QElemType *e, *p;
e = (QElemType *)malloc(sizeof(QElemType));
// InitQueue(&Q);
e->x=1;//入口位置,即为第一个节点
e->y=1;
e->parent=NULL; //第一个节点的前一个节点赋值为空
EnQueue(Q, e);//将第一个节点入队
while(!QueueEmpty(Q))
{
e=DeQueue(Q); //把元素出对,并赋值给e
if(e->x==8&&e->y==8)//出口位置,直接返回最后一个节点
return e;
for(i=1;i<=4;i++)
{//将四个方向能走通的位置的节点入队,并将其的parent指向上一个节点
p=NextPos(e,i);
p->parent=e;
if(maze[p->x][p->y]==1)
{
maze[p->x][p->y]=2;
EnQueue(Q,p);
}
else
{
free(p);
p = NULL;
}
}
}
printf("zhao bu dao");//找不到路径
return NULL;
}
void main()//主函数
{
LinkQueue Q;
QElemType *p, *t;
int maze[10][10]=//其中1为能走通
{{0,0,0,0,0,0,0,0,0,0},
{0,1,1,0,1,1,1,0,1,0},
{0,1,1,0,1,1,1,0,1,0},
{0,1,1,1,1,0,0,1,1,0},
{0,1,0,0,0,1,1,1,1,0},
{0,1,1,1,0,1,1,1,1,0},
{0,1,0,1,1,1,0,1,1,0},
{0,1,0,0,0,1,0,0,1,0},
{0,0,1,1,1,1,1,1,1,0},
{0,0,0,0,0,0,0,0,0,0}
};
InitQueue(&Q);
p=MazePath(maze,&Q);//e即为最后一个节点
while(p)//回溯寻找路径
{
printf("(%d,%d),",p->x,p->y);
t = p->parent;
free(p);
p = t;
}
getchar();
}
改好了,你自己看看有没有错误。
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct QElemType
{
int x,y;
struct QElemType *parent;//用于存储节点的前一个节点
} QElemType;
typedef struct QNode//队列节点
{
QElemType *data;
struct QNode *next;
} QNode, *QueuePtr;
typedef struct
{
QueuePtr front;
QueuePtr rear;
} LinkQueue;
void InitQueue(LinkQueue *Q)//创建队列
{
Q->front=Q->rear=(QueuePtr)malloc(sizeof(QNode));
Q->rear->next = NULL;
//Q->front=Q->rear=NULL;
}
void EnQueue(LinkQueue *Q, QElemType *e)//将元素入队
{
QueuePtr p;
p=(QueuePtr)malloc(sizeof(QNode));
p->data=e;
p->next=NULL;
Q->rear->next=p;
Q->rear=p;
}
QElemType *DeQueue(LinkQueue *Q)//将元素出对
{
QElemType *e;
QueuePtr p;
p=Q->front->next;
e=p->data;
Q->front->next=p->next;
if(Q->rear==p)
Q->rear=Q->front;
free(p);
return (e);
}
int QueueEmpty(LinkQueue *Q)//判断队列是否为空
{
if(Q->front==Q->rear )
return 1;
else
return 0;
}
QElemType *NextPos(QElemType *e,int i)//节点的下一个位置
{
QElemType *t = (QElemType *)malloc(sizeof(QElemType));
*t = *e;
switch(i)
{
case 1:t->y=t->y+1;break;
case 2:t->x=t->x+1;break;
case 3:t->y=t->y-1;break;
case 4:t->x=t->x-1;break;
}
return (t);
}
QElemType *MazePath(int maze[][10],LinkQueue *Q)//迷宫函数
{
int i;
QElemType *e, *p;
e = (QElemType *)malloc(sizeof(QElemType));
// InitQueue(&Q);
e->x=1;//入口位置,即为第一个节点
e->y=1;
e->parent=NULL; //第一个节点的前一个节点赋值为空
EnQueue(Q, e);//将第一个节点入队
while(!QueueEmpty(Q))
{
e=DeQueue(Q); //把元素出对,并赋值给e
if(e->x==8&&e->y==8)//出口位置,直接返回最后一个节点
return e;
for(i=1;i<=4;i++)
{//将四个方向能走通的位置的节点入队,并将其的parent指向上一个节点
p=NextPos(e,i);
p->parent=e;
if(maze[p->x][p->y]==1)
{
maze[p->x][p->y]=2;
EnQueue(Q,p);
}
else
{
free(p);
p = NULL;
}
}
}
printf("zhao bu dao");//找不到路径
return NULL;
}
void main()//主函数
{
LinkQueue Q;
QElemType *p, *t;
int maze[10][10]=//其中1为能走通
{{0,0,0,0,0,0,0,0,0,0},
{0,1,1,0,1,1,1,0,1,0},
{0,1,1,0,1,1,1,0,1,0},
{0,1,1,1,1,0,0,1,1,0},
{0,1,0,0,0,1,1,1,1,0},
{0,1,1,1,0,1,1,1,1,0},
{0,1,0,1,1,1,0,1,1,0},
{0,1,0,0,0,1,0,0,1,0},
{0,0,1,1,1,1,1,1,1,0},
{0,0,0,0,0,0,0,0,0,0}
};
InitQueue(&Q);
p=MazePath(maze,&Q);//e即为最后一个节点
while(p)//回溯寻找路径
{
printf("(%d,%d),",p->x,p->y);
t = p->parent;
free(p);
p = t;
}
getchar();
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询