标题:这个迷宫问题链栈实现
只看楼主
gdtwgz
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2007-5-11
 问题点数:0 回复次数:8 
这个迷宫问题链栈实现

这个题目就是给定一个迷宫数组,让走下来。应用链栈。
我的思想是:先判断走的路是否正确,0是正确,1是墙,2是终点。然后用1234分别表示移动方向,保存在elem结构体中的c里边。比如从右边走来,就是1,上边走来就是2,左边3,下边走来就是4。
然后这样一步步走,碰头就回。
但是,我在VC上编译没错。但就是不能GO。,
显示:Loaded 'ntdll.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\kernel32.dll', no matching symbolic information found.
First-chance exception in mingg.exe: 0xC0000005: Access Violation.


一直都是在PUSH函数中有错,
所以没办法继续执行,不知道有没有逻辑错误
求高手帮忙看一下
#include<stdio.h>
#include<malloc.h>
typedef struct {
int a;
int b; //a,b,分别表示迷宫中当前在数组中的位置
int c; //c表示移动方向;
}elem;
typedef struct Link1
{
elem p;
struct Link1 *next; //NEXT指向前一个LINK
} link;
int creat(link *p){
p=(link *)malloc(sizeof(link));
if(!p) return -1;
p->next=NULL;
p->p.a=0;
p->p.b=0;
p->p.c=0;
printf("created.\n");
return 1;
}
int pop(link *p,elem *e){
if(p->next==0)return -1;
*e=p->p;
p=p->next;
return 1;
}
int push(link *g,elem e){
link *q;
q=(link *)malloc(sizeof(link));
if(q==NULL)return -1;
q->p.a=e.a;
q->p.b=e.b;
q->p.c=e.c;
q->next=g->next;
g->next=q;
return 1;
}
int sousou(link *road,int (*a)[10],int i,int j,int k){
int (*q)[10];
q=a;
if(*(*(q+i)+j)==0)
{ int m;
elem p,*r;
p.a=i;
p.b=j;
p.c=k;
push(road,p);

switch(k){
case 1:if(!(m=sousou(road,a,i,j-1,1))) //1,2,3,4表示移动方向,1表示左,2下,3右,4上
if(!(m=sousou(road,a,i+1,j,2)))
m=sousou(road,a,i-1,j,4);break;
case 2:if(!(m=sousou(road,a,i,j-1,1)))
if(!(m=sousou(road,a,i+1,j,2)))
m=sousou(road,a,i,j+1,3);break;
case 3:if(!(m=sousou(road,a,i+1,j,2)))
if(!(m=sousou(road,a,i,j+1,3)))
m=sousou(road,a,i-1,j,4);break;
case 4:if(!(m=sousou(road,a,i,j-1,1)))
if(!(m=sousou(road,a,i+1,j,2)))
m=sousou(road,a,i-1,j,4);break;
}if(m==2)return 2;
else if(m==0) {pop(road,r); return 0;}
else return 1;
}
else if(*(*(q+i)+j)==2) return 2;
else return 0;


}
int main()
{
elem *p;
link *s;
int m,i;
int a[][10]={
1,0,1,1,1,1,1,1,1,1, //迷宫数组
1,0,0,1,0,0,0,1,0,1,
1,0,0,0,0,1,1,0,1,1,
1,0,1,1,1,0,0,1,0,1,
1,0,0,0,1,0,0,0,0,1,
1,0,1,0,0,0,1,0,1,1,
1,0,1,1,1,1,0,0,1,1,
1,1,1,0,0,0,1,0,1,1,
1,1,1,0,0,0,0,0,0,2,
1,1,1,1,1,1,1,1,1,1
};

if(!creat(s)) return -1;
m=sousou(s,a,0,1,2);
if(!m)
printf("error\n");

else{
for(i=1;s->next==NULL;i++){
pop (s,p);
printf("(%d,%d,%d)\n",p->a,p->b,p->c);
}
}
getchar();
return 0;

}

搜索更多相关主题的帖子: 链栈 迷宫 found information Loaded 
2007-11-02 09:36
gdtwgz
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2007-5-11
得分:0 

没人帮帮忙吗?我快疯了


2007-11-02 22:25
vbc
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:352
专家分:147
注 册:2006-12-30
得分:0 

你用链表,但是好像没有看到你申请空间构建链表,这样的出错是典型的非法使用内存.


清远鹏程万里人才网:[url=http://www.]http://www.[/url]zq.,qy.
2007-11-03 18:03
卧龙孔明
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:59
帖 子:3872
专家分:684
注 册:2006-10-13
得分:0 
算法应该使用深度优先搜索
数据结构最容易实现的应该使用数组

My Blog: www.aiexp.info
虽然我的路是从这里开始的,但是这里不再是乐土.感谢曾经影响过,引导过,帮助过我的董凯,飞燕,leeco,starwing,Rockcarry,soft_wind等等等等.别了,BCCN.
2007-11-03 21:11
linsd2001
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2007-10-11
得分:0 
回复:(gdtwgz)这个迷宫问题链栈实现
你迷宫数组里的0并不能连成一条折线到达2,我想是不是数组没有设对呢?
2007-11-03 22:19
cosdos
Rank: 9Rank: 9Rank: 9
来 自:ShangHai
等 级:蜘蛛侠
威 望:6
帖 子:2109
专家分:1385
注 册:2007-6-19
得分:0 
一种简单的方法是贴着墙壁走.

[此贴子已经被作者于2007-11-4 2:49:22编辑过]



—>〉Sun〈<—
2007-11-04 00:05
gdtwgz
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2007-5-11
得分:0 
回复:(vbc)你用链表,但是好像没有看到你申请空间构...

那个creat是创建连表啊,


2007-11-04 22:59
gdtwgz
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2007-5-11
得分:0 
回复:(卧龙孔明)算法应该使用深度优先搜索数据结构...
因为现在正在学用连表,所一想用连表实现下,能看出我到底什么地方不对吗

2007-11-04 23:00
vbc
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:352
专家分:147
注 册:2006-12-30
得分:0 

你是指这个吗??? p=(link *)malloc(sizeof(link));
你在creat中只申请了一个表头,但你在后面的sousou函数中却调用了push函数出栈.


清远鹏程万里人才网:[url=http://www.]http://www.[/url]zq.,qy.
2007-11-05 09:58



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-182764-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.235436 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved