问题描述
- 迷宫问题出现死循环,经调试发现似乎为结构体中数据无法改变,又或者其他语句导致?
-
#include
#includetypedef struct//定义栈元素结构类型
{
int x;
int y;
int direction;
}data;typedef struct//定义栈
{
data *base;
data *top;
int stacksize;
}sqstack;int initstack(sqstack &s)//建立栈
{
printf("please input the size of stack:");
scanf("%d",&s.stacksize);
s.base=(data *)malloc(s.stacksize*sizeof(data));
if(!s.base)
{
printf("The build is failn");
return 0;
}
s.top=s.base;
return 1;
}int addsize(sqstack &s)//拓增栈
{
s.stacksize++;
data *p;
int i;
i=s.top-s.base;
p=(data *)realloc(s.base,s.stacksize*sizeof(data));
if(!p)
{
printf("Addsize is failn");
return 0;
}
free(s.base);
s.base=p;
s.top=s.base+i;
free(p);
return 1;
}int push(sqstack &s,int i,int j)//向栈顶增加元素
{if((s.top-s.base)>=(s.stacksize-1)) if(!addsize(s)) { printf("Push is failn"); return 0; } (*s.top).x=j; (*s.top).y=i; (*s.top).direction=1; s.top++; return 1;
}
int pop(sqstack &s)//删除栈顶元素
{
if(s.top==s.base)
{
printf("Pop is errorn");
return 0;
}
s.top--;
return 1;
}int gettop(sqstack &s,data p)
{
if(s.top==s.base)
return 0;
p=*(s.top-1);
return 1;
}int way(sqstack &s,int a[][10])
{
data p;//用于接收,使用栈顶结构体元素的数据
int i=-1,j=-1;
while(1)
{
gettop(s,p);
j=p.x;
i=p.y;
if(a[i][j]==10)
return 1;
if(i==(*s.base).y&&j==(*s.base).x&&p.direction==5)
return 0;
if(a[i][j]==0)//该位置可通,则加入栈
{
a[i][j]=2;//用2表示此位置在栈中
if(p.direction==1)
{
j++;
push(s,i,j);
}
if(p.direction==2)
{
i--;
push(s,i,j);
}
if(p.direction==3)
{
j--;
push(s,i,j);
}
if(p.direction==4)
{
i++;
push(s,i,j);
}
}
else//该位置不可通则删除栈顶,后退一步,并转向令一方向
{
pop(s);
gettop(s,p);//p为顶元素
j=p.x;
i=p.y;
p.direction++;//为何此处无法修改数据值?在此处由1变为2后,为又何在while后第一句时数值会变为1,导致死循环?是在此处出错或者其他地方出错
a[i][j]=0;} if(p.direction==5)//如果该位置4个方向都已经尝试且不通,删除栈顶 { a[i][j]=5;//以5表示此位置已走过且过此处必 pop(s); gettop(s,p); j=p.x; i=p.y; p.direction++; a[i][j]=0; } }
}
int main()//输入为的数据为: 30(建立的站的大小) 1 1(起点) 8 8(终点);
{
int a[][10]={{1,1,1,1,1,1,1,1,1,1},{1,0,0,1,0,0,0,1,0,1},{1,0,0,1,0,0,0,1,0,1},{1,0,0,0,0,1,1,0,0,1},{1,0,1,1,1,0,0,0,0,1},{1,0,0,0,1,0,0,0,0,1},{1,0,1,1,1,0,1,1,0,1},{1,1,0,0,0,0,0,0,0,1},{1,1,1,1,1,1,1,1,1,1}};
int i,j;sqstack s; initstack(s); printf("please input the start x and y: "); scanf("%d %d",&j,&i); push(s,i,j); printf("n"); printf("please input the end x and y: "); scanf("%d %d",&i,&j); a[i][j]=10; printf("n");//可运行至此处 way(s,a);//于此处出错 for(i=0;i<10;i++) for(j=0;j<10;j++) { if(j!=9) printf("%d",a[i][j]); if(j==9) printf("%dn",a[i][j]); }//输出结果中1为墙壁,5为走过的死路径,2为可通的活路径//(win8无法运行,借个电脑调试排错) return 0;
}