| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 469 人关注过本帖
标题:C语言迷宫求解 求解函数执行还有问题 大家帮忙看下啊,拜托了,很急~
取消只看楼主 加入收藏
lcy1095
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-2-27
结帖率:0
收藏
已结贴  问题点数:20 回复次数:2 
C语言迷宫求解 求解函数执行还有问题 大家帮忙看下啊,拜托了,很急~
//C语言迷宫求解 求解函数执行还有问题 大家帮忙看下啊,拜托了,很急~

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

#define TRUE      1
#define FALSE     0

#define OVERFLOW -1
#define ERROR    -2

#define width  6                        //迷宫地图宽度
#define height 6                        //迷宫地图高度

#define STACK_INIT_SIZE  50             //栈存储空间初始分配量
#define STACKINCREMENT   10             //栈存储空间分配增量

typedef struct                          //游戏中的位置坐标
{     //二维数组下标
int x;
int y;
}Position;              

typedef struct
{
Position start;                     //起始位置
Position end;                       //结束位置
int      curstep;
}MapCfg;
MapCfg map;

typedef struct
{
int ord;                            //通道块在路径上的序号
Position curpos;                    //通道块在迷宫中的位置坐标
int di;                             //从此通道块走向下一通道块的"方向"
int footprint;                      //是否可以通过的标记, -1:已访问 -2:不可通过
}SElemType;
SElemType e;

typedef struct{
SElemType* base;                    //栈底指针
SElemType*  top;                    //栈顶指针
int stacksize;                      //栈的大小
}SqStack;
SqStack S;                              //S 探索迷宫 存放路径

int count = 0;                          //用于计数,判断次数
int  **Maze()
{
int i=0,j=0;
int **maze;                         //定义二维指针存取迷宫
     maze = new int *[height+2];           //申请长度等于行数加2 的二级指针
for(i= 0;i<height+2;i++)            //申请每个二维指针的空间
{
maze[i] = new int[width+2];
}

/*
    srand((unsigned)time(NULL));                //使用系统时间 传入空指针NULL 作为初始化种子
for(i=1;i<height+2;i++)                     //生成迷宫 0:墙 1:路
            for(j=1;j<width+2;j++)
                    maze[i][j]=rand()%2;        //产生随机数 0 1
*/

maze[1][2] = 0;maze[1][3] = 1;maze[1][4] =0;maze[1][5] =1;maze[1][6] =0;
maze[2][1] = 1;maze[2][2] = 1;maze[2][3] =0;maze[2][4] =0;maze[2][5] =1;maze[2][6] =0;
maze[3][1] = 0;maze[3][2] = 1;maze[3][3] =1;maze[3][4] =0;maze[3][5] =0;maze[3][6] =1;
maze[4][1] = 1;maze[4][2] = 0;maze[4][3] =1;maze[4][4] =1;maze[4][5] =1;maze[4][6] =1;
maze[5][1] = 1;maze[5][2] = 0;maze[5][3] =1;maze[5][4] =0;maze[5][5] =1;maze[5][6] =0;
maze[6][1] = 0;maze[6][2] = 1;maze[6][3] =1;maze[6][4] =0;maze[6][5] =1;

for(i=0;i<height+2;i++)
          maze[i][0]=maze[i][width+1]=0;
                for(j=0;j<width+2;j++)
                         maze[0][j]=maze[width+1][j]=0;

maze[1][1] = maze[height][width] =1;         //指定入口与出口
   
return maze;                                 //返回存贮迷宫的二维指针maze
}
        

int InitStack(SqStack &S)                       //初始化栈 用于探索 存放路径
{
     S.base = (SElemType *)malloc(STACK_INIT_SIZE *sizeof(SqStack));
if(!S.base)
{
return FALSE;                           //存储分配失败
}
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
return TRUE;
}


int StackEmpty(SqStack &S)                      //若栈 S 为空栈,则返回 TRUE,否则返回 FALSE            
{
if(S.top == S.base)
return TRUE;
else
return FALSE;
}


int Push(SqStack &S,SElemType e)
{
if(S.top - S.base >= S.stacksize)           //栈满,追加存储空间
{
S.base = (SElemType *)realloc(S.base,(S.stacksize + STACKINCREMENT) * sizeof(SElemType));
if( !S.base )
exit(OVERFLOW);                    //存储分配失败
S.top = S.base + S.stacksize;
S.stacksize += STACKINCREMENT;
}
*S.top++ = e;
return TRUE;
}



int Pop(SqStack &S, SElemType &e)              //若栈不空,则删除 S 的栈顶元素,用 e 返回其值,并返回 TRUE;否则返回ERROR         
{
if(S.top == S.base)
return ERROR;
e = * --S.top;
return TRUE;
}

int Pass(int **temp, Position curpos)             //判断当前位置可通,返回TRUE,否则返回FALSE
{
count++;                                      //计数,判断次数
printf("第 %d 次判断!\n",count);
printf("当前位置迷宫元素: %d \n",temp[curpos.x][curpos.y]);
if(temp[curpos.y][curpos.x] == 1)            //判断新位置是否可达
return TRUE;
else
return FALSE;
}

int FootPrint(int **m, Position curpos)         //在当前位置标记已访问
{
m[curpos.x ][curpos.y ] = -1;
return TRUE;
}

int MarkPrint(int **m, Position curpos)         //在当前位置标记不可通过
{
m[curpos.x ][curpos.y ] = -2;
return TRUE;  
}


int StackTraverse(SqStack S)                    //遍历栈,输出路径
{
while(S.top > S.base)
{
*--S.top;
printf("序号: %d  位置:(%d,%d)  方向: %d  足迹:%d \n",
S.top->ord,S.top->curpos.x,S.top->curpos.y,S.top->di,S.top->footprint);
}
printf("\n");
return TRUE;
}

int NextPos(Position curpos,int di)              //将当前位置移动到下一位置,继续探索
{
switch(di)                        
{
case 1:                                      //将当前位置东移
curpos.x ++;
return curpos.x;   
break;
case 2:                                      //北移
curpos.y --;
    return curpos.y;
break;
case 3:                                      //西移
curpos.x --;
return curpos.x;
break;
case 4:                                      //南移
curpos.y ++;
return curpos.y;
break;
}
//return FALSE;
}

void errormessage()                              //错误消息提示
{
printf("错误!\n");
}

int MazePath(Position start,Position end)
{ //若迷宫Maze 中存在从入口 start 到出口 end 的通道,则求得一条存放在栈中(从栈底到栈顶),并返回 TRUE ;否则返回 FALSE

int **temp = Maze();

e.curpos.x  = map.start.x;                    //设定"当前位置"为"入口位置"
e.curpos.y  = map.start.y;

map.curstep = 1;                               //探索第一步

do
{   
           
if( Pass(temp, e.curpos) && e.footprint != -1 )     //当前位置可以通过,即是未曾走过的通道块
{      
//    FootPrint(temp, e.curpos);                      //留下足迹,已访问
e.footprint = -1;
e.ord       = map.curstep;
e.di        = 1;

Push(S, e);                                     //加入路径
if(e.curpos.x == map.end.x &&
e.curpos.y == map.end.y)                    //到达终点(出口)
return TRUE;

e.curpos.x = NextPos(e.curpos, 1);              //下一位置是当前位置的东邻

map.curstep ++;                                 //探索下一步
}
else                                                //当前位置不能通过
{
if( !StackEmpty(S) )
{
Pop(S,e);                                   //退回上一步

while(e.di == 4  && !StackEmpty(S))
{  
e.footprint = -2;
//MarkPrint(temp, e.curpos);            //留下不能通过的标记
Pop(S,e);                               //退回一步   
}

if(e.di < 4)
{
e.di++;                                 //换一个方向探索
Push(S,e);
printf("入栈之后:");StackTraverse(S);

switch(e.di)                            //设定当前位置是新方向上的相邻块
{
case 1:                                 //东邻
e.curpos.x = NextPos(e.curpos, e.di);
e.footprint = 0;
    break;
case 2:                                 //北邻
e.curpos.y = NextPos(e.curpos, e.di);
e.footprint = 0;
        break;
case 3:                                 //西邻
e.curpos.x = NextPos(e.curpos, e.di);
e.footprint = 0;
    break;
case 4:                                 //南邻
e.curpos.y = NextPos(e.curpos, e.di);
e.footprint = 0;
        break;
}//switch

printf("下一位置: (%d,%d)  元素: %d   足迹: %d\n",e.curpos.x,e.curpos.y,temp[e.curpos.y][e.curpos.x],e.footprint);

}//if
}//if
}//else
}while( !StackEmpty(S) );

return FALSE;
}

void PrintMap(int **temp)
{
int i,j;
for(i=0;i<height+2;i++)
{putchar('\n');
for(j=0;j<width+2;j++)
          printf("%d ",temp[i][j]);         
     putchar('\n');            
}
}

void menu()                                      //菜单函数
{
int **m = Maze();  
int select;
printf("\n\n1:显示地图             2:显示路径\n\n");
printf("输入选择:  ");
scanf("%d ",&select);
//getchar();
switch(select)
{
case 1:PrintMap(m);break;
case 2:StackTraverse(S);break;
default: exit(0);
}
}

void main()                                      //主函数
{

//menu();

    int **m = Maze();

    PrintMap(m);                                 //输出迷宫

InitStack(S);                                //初始化栈

SElemType *temp = S.top;

    //InitGame(Gam);                             //初始化游戏参数

 map.start.x = map.start.y = 1;              //初始化游戏参数
     map.end.x   = map.end.y   = height;
 map.curstep = 0;
   
     if( MazePath(map.start, map.end) <= 0)      //寻找路径
           errormessage();                       //探索路径失败
   
}
搜索更多相关主题的帖子: 存储 地图 include C语言 
2013-03-07 11:30
lcy1095
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-2-27
收藏
得分:0 
是迷宫求解这个函数执行有问题int MazePath(Position start,Position end),在当前位置不能通过时切换下一位置,只能执行一步,位置坐标只能到(1,2),起始位置为(1,1)
2013-03-07 11:30
lcy1095
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-2-27
收藏
得分:0 
这个是程序中迷宫求解的函数,执行有问题

int MazePath(Position start,Position end)
{ //若迷宫Maze 中存在从入口 start 到出口 end 的通道,则求得一条存放在栈中(从栈底到栈顶),并返回 TRUE ;否则返回 FALSE

int **temp = Maze();                          //调用Maze()函数,返回二维数组指针

e.curpos.x  = map.start.x;                    //设定"当前位置"为"入口位置"
e.curpos.y  = map.start.y;                    //入口位置在main函数已赋值

map.curstep = 1;                               //探索第一步

do
{   
           
if( Pass(temp, e.curpos) && e.footprint != -1 )     //当前位置可以通过,即是未曾走过的通道块
{      
//    FootPrint(temp, e.curpos);                      //留下足迹,已访问
e.footprint = -1;
e.ord       = map.curstep;
e.di        = 1;

Push(S, e);                                     //加入路径
if(e.curpos.x == map.end.x &&
e.curpos.y == map.end.y)                    //到达终点(出口)
return TRUE;

e.curpos.x = NextPos(e.curpos, 1);              //下一位置是当前位置的东邻

map.curstep ++;                                 //探索下一步
}
else                                                //当前位置不能通过
{
if( !StackEmpty(S) )
{
Pop(S,e);                                   //退回上一步

while(e.di == 4  && !StackEmpty(S))
{  
e.footprint = -2;
//MarkPrint(temp, e.curpos);            //留下不能通过的标记
Pop(S,e);                               //退回一步   
}

if(e.di < 4)
{
e.di++;                                 //换一个方向探索
Push(S,e);
StackTraverse(S);

switch(e.di)                            //设定当前位置是新方向上的相邻块
{
case 1:                                 //东邻
e.curpos.x = NextPos(e.curpos, e.di);
e.footprint = 0;
    break;
case 2:                                 //北邻
e.curpos.y = NextPos(e.curpos, e.di);
e.footprint = 0;
        break;
case 3:                                 //西邻
e.curpos.x = NextPos(e.curpos, e.di);
e.footprint = 0;
    break;
case 4:                                 //南邻
e.curpos.y = NextPos(e.curpos, e.di);
e.footprint = 0;
        break;
}//switch

printf("下一位置: (%d,%d)  元素: %d   足迹: %d\n",e.curpos.x,e.curpos.y,temp[e.curpos.y][e.curpos.x],e.footprint);

}//if
}//if
}//else
}while( !StackEmpty(S) );

return FALSE;
}
2013-03-07 11:45
快速回复:C语言迷宫求解 求解函数执行还有问题 大家帮忙看下啊,拜托了,很急~
数据加载中...
 
   



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

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