user-0 提问: 迷宫问题 

回复:
user: user-1
content: 请那些喜欢将数组作为函数参数传来传去或作为函数返回值的码农思考一下为什么不把整个互联网内容当作函数参数传来传去或作为函数返回值呢？

user: user-2
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-0
content: #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函数也不知道改得对不对

user: user-3
content: 那可能是你代码的问题，你现在代码是什么，怎么输入，我帮你看下

user: user-0
content: 引用 6 楼 user-3 的回复:[quote=引用 5 楼 may_Xia 的回复:] [quote=引用 4 楼 user-3 的回复:] [quote=引用 3 楼 may_Xia 的回复:] [quote=引用 2 楼 user-3 的回复:] 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 楼 user-3 的回复:[quote=引用 5 楼 may_Xia 的回复:] [quote=引用 4 楼 user-3 的回复:] [quote=引用 3 楼 may_Xia 的回复:] [quote=引用 2 楼 user-3 的回复:] 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

user: user-0
content: 引用 4 楼 user-3 的回复:[quote=引用 3 楼 may_Xia 的回复:] [quote=引用 2 楼 user-3 的回复:] 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吗？如果直接用宏定义它也显示错误

user: user-3
content: 引用 5 楼 may_Xia 的回复:[quote=引用 4 楼 user-3 的回复:] [quote=引用 3 楼 may_Xia 的回复:] [quote=引用 2 楼 user-3 的回复:] 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++ 项目属性。      单击“链接器”文件夹。      单击“系统”属性页。      修改下列任一属性：          堆栈提交大小          堆栈保留大小

user: user-0
content: 引用 4 楼 user-3 的回复:[quote=引用 3 楼 may_Xia 的回复:] [quote=引用 2 楼 user-3 的回复:] 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

user: user-3
content: 引用 3 楼 may_Xia 的回复:[quote=引用 2 楼 user-3 的回复:] 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循环

user: user-0
content: 引用 2 楼 user-3 的回复: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个数就跳到下一步了,为啥呢??

user: user-3
content: 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++)

user: user-3
content: 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)