user-0 提问: 求大神帮忙改下纯C语言实现的迷宫程序

回复:
user: user-1
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。  崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。

user: user-1
content: 再供参考#include <stdio.h> #include <stdlib.h> #include <conio.h> #include <graphics.h> int xs[10000]; int ys[10000]; int i=0,xx,yy; int fc,bc; void push(int x,int y) {     xs[i]=x;     ys[i]=y;     if (i<10000-1) {         i=i+1;     } else {         printf("stack overflow!\n");         exit(1);     } } void pop(void) {     i=i-1;     xx=xs[i];     yy=ys[i]; } int check(int x,int y) {     int c;      c=getpixel(x,y); /* 获取当前点的颜色 */     return ((c!=bc)&&(c!=fc));/* 如果颜色为边界色或填充色则不填充 */ } void seedfilling(int x,int y,int fill_color,int boundary_color) {     fc=fill_color;     bc=boundary_color;     push(x,y);     while (1) {         if (i<=0) return;         pop();         if (check(xx,yy)) {             putpixel(xx, yy, 14);getch();  /* 加上这行显示当前填充状态 */              putpixel(xx, yy, fill_color); /* 画点 */              if (check(xx-1,yy  )) push(xx-1,yy  );             if (check(xx  ,yy+1)) push(xx  ,yy+1);             if (check(xx  ,yy-1)) push(xx  ,yy-1);             if (check(xx+1,yy  )) push(xx+1,yy  );             /* 去掉下面四句就是四连通 */             if (check(xx-1,yy-1)) push(xx-1,yy-1);             if (check(xx-1,yy+1)) push(xx-1,yy+1);             if (check(xx+1,yy-1)) push(xx+1,yy-1);             if (check(xx+1,yy+1)) push(xx+1,yy+1);         }     } } void main() {     int a,b,color;     int gdriver = DETECT, gmode, errorcode;     int poly[10];      initgraph(&gdriver, &gmode, "d:\\bc\\bgi");     a=150;     b=140;     color=4;     poly[0]=110;/* 第一个点的x坐标以及y坐标 */     poly[1]=110;     poly[2]=200;/* 第二点 */     poly[3]=105;     poly[4]=170;/* 第三点 */     poly[5]=120;     poly[6]=150;/* 第四点 */     poly[7]=170;     poly[8]=110;/* 多边形的起点与终点一样 */     poly[9]=110;     drawpoly(5,poly);/* 显示各点连接起来的多边形 */      /* 保证边界对八连通是封闭的 */     setviewport(0,1,600,300,0);     drawpoly(5,poly);/* 显示各点连接起来的多边形 */     setviewport(1,0,600,300,0);     drawpoly(5,poly);/* 显示各点连接起来的多边形 */     setviewport(1,1,600,300,0);     drawpoly(5,poly);/* 显示各点连接起来的多边形 */      /* 恢复默认viewport */     setviewport(0,0,600,300,0);      seedfilling(a,b,color,15);  /* 种子填充多边形 */      getch();     closegraph(); }

user: user-1
content: 仅供参考/**  * @Title  老鼠走迷宫  * @Author 孙琨  * @Date   2013-11-16  * @At     XUST  * @All Copyright by 孙琨  *  */  #include <iostream> using namespace std;  int maze[7][7] = { // 初始化迷宫，英文maze为“迷宫”     {2,2,2,2,2,2,2},     {2,0,0,0,0,0,2},     {2,0,2,0,2,0,2},     {2,0,0,2,0,2,2},     {2,2,0,2,0,2,2},     {2,0,0,0,0,0,2},     {2,2,2,2,2,2,2} };  int startI = 1,startJ = 1; // 入口行列坐标 int endI = 5,endJ = 5;     // 出口行列坐标 int success = 0;           // 判断路是否走通  int visit(int i,int j)  // 自动搜寻路径 {     maze[i][j] = 1;      if((i == endI) && (j == endJ))         success = 1;      if((success != 1) && (maze[i][j+1] == 0))  // 下         visit(i,j+1);     if((success != 1) && (maze[i+1][j]) == 0)  // 右         visit(i+1,j);     if((success != 1) && (maze[i][j-1] == 0))  // 上         visit(i,j-1);     if((success != 1) && (maze[i-1][j] == 0))  // 左         visit(i-1,j);      if(success != 1)         maze[i][j] = 0;      return success;  }  int main(void) {     int i,j;      cout << "显示迷宫: " << endl;     for(i=0; i<7; i++)     {         for(j=0; j<7; j++)         {             if(maze[i][j] == 2)                 cout << "■" ;             else                 cout << "  " ;         }         cout << endl;     }      if(visit(startI,startJ) == 0)     {         cout << endl << "没有找到出口!" << endl;     }     else     {         cout << endl << "显示路径: " << endl;         for(i=0; i<7; i++)         {             for(j=0; j<7; j++)             {                 if(maze[i][j] == 2)                     cout << "■";                 else if(maze[i][j] == 1)                     cout << "♀";                 else                     cout << "  ";             }             cout << endl;         }     }     return 0; }

user: user-0
content: 引用 9 楼 zhao4zhong1 的回复:代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。  崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。  谢谢赵老师。

user: user-0
content: 引用 9 楼 zhao4zhong1 的回复:代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。  崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。  赵老师说得对，现在自己已经解决了。

user: user-2
content: 引用 9 楼 zhao4zhong1 的回复:代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。  崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。  老师说的很对啊！

user: user-3
content: 引用 5 楼 addsspu 的回复:[quote=引用 4 楼 zjq9931 的回复:] 语法错误给你改没了，但是逻辑错误得你自己查了。 谢谢，逻辑错误我目前查不出来啊，纠结中[/quote] 其实这个程序的逻辑我都没心思来看。这个有说明还好说，没有说明，你自己看吧。

user: user-0
content: 引用 4 楼 zjq9931 的回复:语法错误给你改没了，但是逻辑错误得你自己查了。 谢谢，逻辑错误我目前查不出来啊，纠结中

user: user-3
content: 语法错误给你改没了，但是逻辑错误得你自己查了。  //头文件SqStack.h #ifndef SQSTACK_H_ #define SQSTACK_H_  #ifndef constant #define constant  #define ElemType int #define OVERFLOW 0 #define OK 1 #define ERROR 0  typedef int Status;  #include <stdlib.h>  #endif /* constant */  typedef struct {     int x;     int y; }PosType;  typedef struct {     int ord;     PosType seat;     int di; }SElemType;  #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10  typedef struct {     SElemType *base;     SElemType *top;     int stacksize; }SqStack;  Status InitStack_Sq(SqStack *S); Status CreateStack_Sq(SqStack *S,SElemType elem[],int n); Status DestroyStack_Sq(SqStack *S); Status ClearStack_Sq(SqStack *S); int EmptyStack_Sq(SqStack *S); int LengthStack_Sq(SqStack *S); Status GetTop_Sq(SqStack *S,SElemType *e); Status Push_Sq(SqStack *S,SElemType e); Status Pop_Sq(SqStack *S,SElemType *e);  #endif /* SQSTACK_H_ */ //栈实现，应该没有问题，测试过SqStack.c   #include "SqStack.h" int mutex; Status InitStack_Sq(SqStack *S){     if(mutex==1) {free(S->base);mutex=0;S->base=S->top=NULL;}     S->base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));     if(!S->base) exit(OVERFLOW);     S->top=S->base;     S->stacksize=STACK_INIT_SIZE;     mutex=1;     return OK; }   Status CreateStack_Sq(SqStack *S,SElemType elem[],int n){     int i;     if(mutex==1) {free(S->base);mutex=0;S->base=S->top=NULL;}     S->base=(SElemType *)malloc((n/STACK_INIT_SIZE+1)*STACK_INIT_SIZE*sizeof(SElemType));     if(!S->base) exit(OVERFLOW);     S->top=S->base;     S->stacksize=STACK_INIT_SIZE*(n/STACK_INIT_SIZE+1);     mutex=1;     for(i=0;i<n;i++){         *S->top++=elem[i];     }     return OK; }   Status DestroyStack_Sq(SqStack *S){     if(mutex==1) {free(S->base);mutex=0;S->base=S->top=NULL;}     return OK; } Status ClearStack_Sq(SqStack *S){     S->top=S->base;     return OK; } int EmptyStack_Sq(SqStack *S){     return S->base==S->top; } int LengthStack_Sq(SqStack *S){     return S->top-S->base; } Status GetTop_Sq(SqStack *S,SElemType *e){     if(S->base==S->top)return ERROR;     *e=*(S->top-1);       return OK; }   Status Push_Sq(SqStack *S,SElemType e){     if(S->top-S->base>=S->stacksize){         S->base=(SElemType *)realloc(S->base,(STACK_INIT_SIZE+STACKINCREMENT)*sizeof(SElemType));         if(!S->base) exit(OVERFLOW);         S->top=S->base+S->stacksize;         S->stacksize=S->stacksize+STACKINCREMENT; }     *S->top++=e;     return OK; }   Status Pop_Sq(SqStack *S,SElemType *e){     if(S->top!=S->base)         *e=*--(S->top);     else         return ERROR;     return OK; }   //迷宫程序MazePath.c 不要求把迷宫路径，只要把路径压入栈中即可   #define M 8 #define N 8 #include "SqStack.h" #include <stdio.h>   PosType NextPos(PosType *pos,int di){     switch(di){     case 0:pos->x--;break;     case 1:pos->y++;break;     case 2:pos->x++;break;     case 3:pos->y--;break;     }     return *pos; }   Status MazePath(SqStack *S,int maze[][10],PosType start,PosType end){     PosType curpos=start;     int curstep=1;     SElemType e;     InitStack_Sq(S);//InitStack_Sq(&S);       do{           if(maze[start.x][start.y]==0){             e.ord=curstep;e.seat=curpos;e.di=1;             Push_Sq(S,e);//Push_Sq(&S,e);             if(curpos.x==end.x && curpos.y==end.y ) return OK;             curpos=NextPos(&curpos,1);             curstep++;         }         else{               if(!EmptyStack_Sq(S)){//if(!EmptyStack_Sq(&S)){                 Pop_Sq(S,&e);//Pop_Sq(&S,&e);                 while(e.di==4 && !EmptyStack_Sq(S)){//while(e.di==4 && !EmptyStack_Sq(&S)){                     maze[e.seat.x][e.seat.y]=1;                     Pop_Sq(S,&e);//Pop_Sq(&S,&e);                 }                   if(e.di<4){                     e.di++;                     Push_Sq(S,e);//Push_Sq(&S,e);                       curpos=NextPos(&e.seat,e.di);                 }               }           }       }while(!EmptyStack_Sq(S));//}while(!EmptyStack_Sq(&S));     return ERROR; }   int main(){     SqStack S;     int find=0;     int mg[M+2][N+2]={                 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},                 {1, 0, 0, 1, 0, 0, 0, 1, 0, 1},                 {1, 0, 1, 1, 0, 1, 0, 1, 0, 1},                 {1, 0, 0, 0, 0, 1, 1, 0, 0, 1},                 {1, 0, 1,  1, 1, 0, 1, 1, 0, 1},                 {1, 0, 0, 0, 1, 0, 0, 0, 1, 1},                 {1, 0, 1, 0, 0, 0, 1, 0, 0, 1},                 {1, 0, 1, 1, 1, 0, 1, 1, 0, 1},                 {1, 0, 0, 0, 0, 0, 1, 0, 0, 1},                 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}         };       PosType start,end;     char cc;     start.x=1;     start.y=1;     end.x=M;     end.y=N;     find=MazePath(&S,mg,start,end);     printf("%d\n",find);     return 0; }

user: user-0
content: 引用 2 楼 user-4 的回复:要改什么东西你没说,改错误还是什么  程序运行不了啊

user: user-4
content: 要改什么东西你没说,改错误还是什么

user: user-0
content: 人呢