迷宫问题

may_Xia 2016-12-20 07:33:47
数组传递错误???


#include<stdio.h>
#include<stdlib.h>


typedef struct
{
int x,y,r;
/*line、list、dir分别为数组元素的行坐标、列坐标、choice数组的下标值即对应方向*/
}
DataType;

struct SeqStack
{
int MAXNUM;
int t;
DataType *s;
};
typedef struct SeqStack *PSeqStack;

PSeqStack create_EmptySeqStack(int n)
{
PSeqStack p=(PSeqStack)malloc(sizeof(struct SeqStack));
if(p!=NULL)
{
p->s=(DataType*)malloc(sizeof(DataType)*n);
if(p->s)
{
p->MAXNUM=n;
p->t=-1;
return p;
}
else free(p);
}
printf("Out of Space!\n");
return NULL;
}

int createmaze(int a[100][100],int m,int n)
{
int x,y;
for(x=0;x<m;x++)
a[x][0]=1;a[x][n-1]=1;
for(y=0;y<n;y++)
a[0][y]=1;a[m-1][y]=1;
printf("请输入内部迷宫组织,可走通的路径点为0,走不通为1.\n");
for(x=1,y=1;x<m-1,y<n-1;x++,y++)
scanf("%d",&a[x][y]);

}

int is_EmptyStack(PSeqStack p)
{
return(p->t==-1);
}

void pop(PSeqStack p)
{
if(p->t==-1) printf("Underflow!\n");
else p->t=p->t-1;
}

DataType top(PSeqStack p)
{
if(p->t==-1) printf("Stack is empty!\n");
else return(p->s[p->t]);
}

void push(PSeqStack p,DataType x)
{
if(p->t>=(p->MAXNUM)-1) printf("Overflow!\n");
else
{
p->t=p->t+1;
p->s[p->t]=x;
}
}

void mazepath(int *maze[],int *direction[],int x1,int y1,int x2,int y2,int M,int N)
{
int i,j,k;
int g,h;
PSeqStack st;
DataType element;
st=create_EmptySeqStack(M*N);
maze[x1][y1]=2;
element.x=x1;
element.y=y1;
element.r=-1;
push(st,element);
while(!is_EmptyStack(st))
{
element=top(st);
pop(st);
i=element.x;
j=element.y;
k=element.r+1;
while(k<=3)
{
g=i+direction[k][0];
h=j+direction[k][1];
if(g==x2&&h==y2&&maze[g][h]==0)
{
printf("The reverse path is:\n");
while(!is_EmptyStack(st));
{
element=top(st);
pop(st);
printf("the node is:%d%d\n",element.x,element.y);
}
return;
}
if(maze[g][h]==0)
{
maze[g][h]=2;
element.x=i;
element.y=j;
element.r=k;
push(st,element);
i=g;
j=h;
k=-1;
}
k=k+1;
}
}
printf("The path has not been found.\n");
}

int main()
{
int a,b,c,d,i,j;
int s=0;
int sta1,sta2,end1,end2;
int maze[100][100];
printf("确定迷宫大小:请输入迷宫长、宽分别为(长宽均不大于100):\n");
scanf("%d %d",&a,&b);
createmaze(maze,a,b);
printf("请输入入口、出口坐标为:\n");
scanf("%d %d %d %d",&sta1,&sta2,&end1,&end2);
maze[end1][end2]=0; /*出口可走通*/
int choice[8][2]={0,1,1,0,0,-1,-1,0,1,1,-1,1,1,-1,-1,-1};
/*每点处下一走向有8种选择,数组元素对应与i或j相加的值,每一行的两个数组元素对应东南西北、东南、东北、西南、西北8个方向。*/
mazepath(maze,choice,sta1,sta2,end1,end2,a,b);
}
...全文
214 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-12-21
  • 打赏
  • 举报
回复
请那些喜欢将数组作为函数参数传来传去或作为函数返回值的码农思考一下为什么不把整个互联网内容当作函数参数传来传去或作为函数返回值呢?
小灸舞 版主 2016-12-21
  • 打赏
  • 举报
回复
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
may_Xia 2016-12-20
  • 打赏
  • 举报
回复
#include<stdio.h> #include<stdlib.h> typedef struct { int x,y,r; /*line、list、dir分别为数组元素的行坐标、列坐标、choice数组的下标值即对应方向*/ } DataType; struct SeqStack { int MAXNUM; int t; DataType *s; }; typedef struct SeqStack *PSeqStack; PSeqStack create_EmptySeqStack(int n) { PSeqStack p=(PSeqStack)malloc(sizeof(struct SeqStack)); if(p!=NULL) { p->s=(DataType*)malloc(sizeof(DataType)*n); if(p->s) { p->MAXNUM=n; p->t=-1; return p; } else free(p); } printf("Out of Space!\n"); return NULL; } int createmaze(int a[20][20],int m,int n) { int x,y; printf("请输入内部迷宫组织,可走通的路径点为0,走不通为1.\n"); for(x=0;x<m;x++) { for(y=0;y<n;y++) { scanf("%d",&a[x][y]); } } } int is_EmptyStack(PSeqStack p) { return(p->t==-1); } void pop(PSeqStack p) { if(p->t==-1) printf("Underflow!\n"); else p->t=p->t-1; } DataType top(PSeqStack p) { if(p->t!=-1) return(p->s[p->t]); } void push(PSeqStack p,DataType x) { if(p->t>=(p->MAXNUM)-1) printf("Overflow!\n"); else { p->t=p->t+1; p->s[p->t]=x; } } void mazepath(int (*maze)[20],int (*direction)[2],int x1,int y1,int x2,int y2,int M,int N) { int i,j,k; int g,h; PSeqStack st; DataType element; st=create_EmptySeqStack(M*N); maze[x1][y1]=2; element.x=x1; element.y=y1; element.r=-1; push(st,element); while(!is_EmptyStack(st)) { element=top(st); pop(st); i=element.x; j=element.y; k=element.r+1; while(k<=3) { g=i+direction[k][0]; h=j+direction[k][1]; if(g==x2&&h==y2&&maze[g][h]==0) { printf("The reverse path is:\n"); while(!is_EmptyStack(st)); { element=top(st); pop(st); printf("the node is:%d%d\n",element.x,element.y); } return; } if(maze[g][h]==0) { maze[g][h]=2; element.x=i; element.y=j; element.r=k; push(st,element); i=g; j=h; k=-1; } k=k+1; } } printf("The path has not been found.\n"); } int main() { int a,b,c,d,i,j; int s=0; int sta1,sta2,end1,end2; int maze[20][20]; printf("确定迷宫大小:请输入迷宫长、宽分别为(长宽均不大于100):\n"); scanf("%d %d",&a,&b); createmaze(maze,a,b); printf("请输入入口、出口坐标为:\n"); scanf("%d %d %d %d",&sta1,&sta2,&end1,&end2); maze[end1][end2]=0; int choice[4][2]={0,1,1,0,0,-1,-1,0}; mazepath(maze,choice,sta1,sta2,end1,end2,a,b); return 0; } 谢谢 结果总是出不来 top函数也不知道改得对不对
paschen 2016-12-20
  • 打赏
  • 举报
回复
那可能是你代码的问题,你现在代码是什么,怎么输入,我帮你看下
may_Xia 2016-12-20
  • 打赏
  • 举报
回复
引用 6 楼 paschen 的回复:
[quote=引用 5 楼 may_Xia 的回复:] [quote=引用 4 楼 paschen 的回复:] [quote=引用 3 楼 may_Xia 的回复:] [quote=引用 2 楼 paschen 的回复:] top函数不是每种情况都有返回值 for(x=1,y=1;x<m-1,y<n-1;x++,y++) 应该是这样吧: for(x=1,y=1;x<m-1&&y<n-1;x++,y++)
如果改成这样 int createmaze(int a[100][100],int m,int n) { int x,y; printf("请输入内部迷宫组织,可走通的路径点为0,走不通为1.\n"); for(x=0,y=0;x<m&&y<n;x++,y++) scanf("%d",&a[x][y]); } 就算输入长宽分别为9,也只能只输入9个数就跳到下一步了,为啥呢??[/quote] 你应该把循环写成骨嵌套的等式,外层对x,内层对y循环[/quote] 改了...然后无论怎么输入都是overflow[/quote] 是栈溢出吗,你的int maze[100][100];数组比较大 把项目属性中栈大小设置大一点: 打开此项目的“属性页”对话框。有关详细信息,请参见设置 Visual C++ 项目属性。 单击“链接器”文件夹。 单击“系统”属性页。 修改下列任一属性: 堆栈提交大小 堆栈保留大小[/quote]
引用 6 楼 paschen 的回复:
[quote=引用 5 楼 may_Xia 的回复:] [quote=引用 4 楼 paschen 的回复:] [quote=引用 3 楼 may_Xia 的回复:] [quote=引用 2 楼 paschen 的回复:] top函数不是每种情况都有返回值 for(x=1,y=1;x<m-1,y<n-1;x++,y++) 应该是这样吧: for(x=1,y=1;x<m-1&&y<n-1;x++,y++)
如果改成这样 int createmaze(int a[100][100],int m,int n) { int x,y; printf("请输入内部迷宫组织,可走通的路径点为0,走不通为1.\n"); for(x=0,y=0;x<m&&y<n;x++,y++) scanf("%d",&a[x][y]); } 就算输入长宽分别为9,也只能只输入9个数就跳到下一步了,为啥呢??[/quote] 你应该把循环写成骨嵌套的等式,外层对x,内层对y循环[/quote] 改了...然后无论怎么输入都是overflow[/quote] 是栈溢出吗,你的int maze[100][100];数组比较大 把项目属性中栈大小设置大一点: 打开此项目的“属性页”对话框。有关详细信息,请参见设置 Visual C++ 项目属性。 单击“链接器”文件夹。 单击“系统”属性页。 修改下列任一属性: 堆栈提交大小 堆栈保留大小[/quote] 我直接把数组改成了20X20? 然后输入迷宫大小是3X3 迷宫点都可走通都为0 入口1 1 出口3 3 他也显示全是overflow
may_Xia 2016-12-20
  • 打赏
  • 举报
回复
引用 4 楼 paschen 的回复:
[quote=引用 3 楼 may_Xia 的回复:] [quote=引用 2 楼 paschen 的回复:] top函数不是每种情况都有返回值 for(x=1,y=1;x<m-1,y<n-1;x++,y++) 应该是这样吧: for(x=1,y=1;x<m-1&&y<n-1;x++,y++)
如果改成这样 int createmaze(int a[100][100],int m,int n) { int x,y; printf("请输入内部迷宫组织,可走通的路径点为0,走不通为1.\n"); for(x=0,y=0;x<m&&y<n;x++,y++) scanf("%d",&a[x][y]); } 就算输入长宽分别为9,也只能只输入9个数就跳到下一步了,为啥呢??[/quote] 你应该把循环写成骨嵌套的等式,外层对x,内层对y循环[/quote] 是因为没有定义MAXNUM吗?如果直接用宏定义它也显示错误
paschen 2016-12-20
  • 打赏
  • 举报
回复
引用 5 楼 may_Xia 的回复:
[quote=引用 4 楼 paschen 的回复:] [quote=引用 3 楼 may_Xia 的回复:] [quote=引用 2 楼 paschen 的回复:] top函数不是每种情况都有返回值 for(x=1,y=1;x<m-1,y<n-1;x++,y++) 应该是这样吧: for(x=1,y=1;x<m-1&&y<n-1;x++,y++)
如果改成这样 int createmaze(int a[100][100],int m,int n) { int x,y; printf("请输入内部迷宫组织,可走通的路径点为0,走不通为1.\n"); for(x=0,y=0;x<m&&y<n;x++,y++) scanf("%d",&a[x][y]); } 就算输入长宽分别为9,也只能只输入9个数就跳到下一步了,为啥呢??[/quote] 你应该把循环写成骨嵌套的等式,外层对x,内层对y循环[/quote] 改了...然后无论怎么输入都是overflow[/quote] 是栈溢出吗,你的int maze[100][100];数组比较大 把项目属性中栈大小设置大一点: 打开此项目的“属性页”对话框。有关详细信息,请参见设置 Visual C++ 项目属性。 单击“链接器”文件夹。 单击“系统”属性页。 修改下列任一属性: 堆栈提交大小 堆栈保留大小
may_Xia 2016-12-20
  • 打赏
  • 举报
回复
引用 4 楼 paschen 的回复:
[quote=引用 3 楼 may_Xia 的回复:] [quote=引用 2 楼 paschen 的回复:] top函数不是每种情况都有返回值 for(x=1,y=1;x<m-1,y<n-1;x++,y++) 应该是这样吧: for(x=1,y=1;x<m-1&&y<n-1;x++,y++)
如果改成这样 int createmaze(int a[100][100],int m,int n) { int x,y; printf("请输入内部迷宫组织,可走通的路径点为0,走不通为1.\n"); for(x=0,y=0;x<m&&y<n;x++,y++) scanf("%d",&a[x][y]); } 就算输入长宽分别为9,也只能只输入9个数就跳到下一步了,为啥呢??[/quote] 你应该把循环写成骨嵌套的等式,外层对x,内层对y循环[/quote] 改了...然后无论怎么输入都是overflow
paschen 2016-12-20
  • 打赏
  • 举报
回复
引用 3 楼 may_Xia 的回复:
[quote=引用 2 楼 paschen 的回复:] top函数不是每种情况都有返回值 for(x=1,y=1;x<m-1,y<n-1;x++,y++) 应该是这样吧: for(x=1,y=1;x<m-1&&y<n-1;x++,y++)
如果改成这样 int createmaze(int a[100][100],int m,int n) { int x,y; printf("请输入内部迷宫组织,可走通的路径点为0,走不通为1.\n"); for(x=0,y=0;x<m&&y<n;x++,y++) scanf("%d",&a[x][y]); } 就算输入长宽分别为9,也只能只输入9个数就跳到下一步了,为啥呢??[/quote] 你应该把循环写成骨嵌套的等式,外层对x,内层对y循环
may_Xia 2016-12-20
  • 打赏
  • 举报
回复
引用 2 楼 paschen 的回复:
top函数不是每种情况都有返回值 for(x=1,y=1;x<m-1,y<n-1;x++,y++) 应该是这样吧: for(x=1,y=1;x<m-1&&y<n-1;x++,y++)
如果改成这样 int createmaze(int a[100][100],int m,int n) { int x,y; printf("请输入内部迷宫组织,可走通的路径点为0,走不通为1.\n"); for(x=0,y=0;x<m&&y<n;x++,y++) scanf("%d",&a[x][y]); } 就算输入长宽分别为9,也只能只输入9个数就跳到下一步了,为啥呢??
paschen 2016-12-20
  • 打赏
  • 举报
回复
top函数不是每种情况都有返回值 for(x=1,y=1;x<m-1,y<n-1;x++,y++) 应该是这样吧: for(x=1,y=1;x<m-1&&y<n-1;x++,y++)
paschen 2016-12-20
  • 打赏
  • 举报
回复
void mazepath(int *maze[],int *direction[],int x1,int y1,int x2,int y2,int M,int N) 改成; void mazepath(int (*maze)[100],int (*direction)[2],int x1,int y1,int x2,int y2,int M,int N)

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧