| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3706 人关注过本帖
标题:求大神帮忙写一个求解迷宫的程序,用栈实现就可以
只看楼主 加入收藏
搁浅时光
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2017-5-28
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:10 
求大神帮忙写一个求解迷宫的程序,用栈实现就可以
求解迷宫,用栈实现,最后输出路线坐标和方向就好
搜索更多相关主题的帖子: 迷宫  输出 坐标 
2017-05-28 15:02
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:10 
用递归不行么~递归的原理和栈类似~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-29 12:04
林月儿
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:湖南
等 级:版主
威 望:138
帖 子:2277
专家分:10647
注 册:2015-3-19
收藏
得分:10 
感觉不简单的样子,是java还是c啊?

剑栈风樯各苦辛,别时冰雪到时春
2017-05-29 15:01
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 3楼 林月儿
如果这个还说不简单~那么用队列进行广搜求迷宫最短路径就基本没戏了(当然如果不优先考虑效率问题我曾经见过某大触不用队列直接用for循环解决)~~其实无论用栈用队列还是用简单的递归~关键是要摸清楚其遍历方式~这个和树和图的遍历方式是有相通的地方的~~迷宫其实属于图的一种~~不过其方块结构可以直接通过数组下标运算找到关联~就是这样~

[此贴子已经被作者于2017-5-29 22:43编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-29 22:42
林月儿
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:湖南
等 级:版主
威 望:138
帖 子:2277
专家分:10647
注 册:2015-3-19
收藏
得分:0 
回复 4楼 九转星河
我是小菜鸟

剑栈风樯各苦辛,别时冰雪到时春
2017-05-29 23:42
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 5楼 林月儿
以下是引用林月儿在2017-5-29 23:42:55的发言:

我是小菜鸟

看上去不像哦~两年时间拿了几十点威望非常不简单啊~说是新手太过谦虚了吧~~

不过我还是问一下~你现在就读大学么~~是不是大一的~之前没咋见过面~混过面熟~~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-30 15:08
林月儿
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:湖南
等 级:版主
威 望:138
帖 子:2277
专家分:10647
注 册:2015-3-19
收藏
得分:0 
回复 6楼 九转星河
不太清楚威望什么的规则啦,只是感兴趣凑凑热闹。不过感觉你真的很厉害的样子。是大一啦,はじめまして、よろしくお願いいたします

剑栈风樯各苦辛,别时冰雪到时春
2017-05-30 17:29
搁浅时光
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2017-5-28
收藏
得分:0 
求帮忙,用C写的源代码啊,谢谢各位辣

做一个安安静静的码代码妹子!!!
2017-05-31 08:56
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
感觉自己写的这个结构有点复杂~参考一下就可以了~

还有通用链表参考头文件"List.h"

https://bbs.bccn.net/thread-476405-1-1.html
30楼代码~

程序代码:
#include"List.h"
#include<windows.h>
#include<conio.h>

#ifndef MAXSIZE

#define MAXSIZE 10    //迷宫的最大长度

#endif

typedef char MAP;     //自定义迷宫地图

typedef enum Visit
{
    DISCOVER,
    COVER,
}Visit;

typedef enum DIRECTION  //枚举四个方向
{
    UP,
    DOWN,
    LEFT,
    RIGHT,

}DIRECTION; 

typedef struct Point  //定义坐标对
{
    int x;            //横坐标
    int y;            //纵坐标
}Point; 

typedef struct Graph  //储存迷宫地图结构体
{
    Visit visit[sizeof(DISCOVER)];
    Visit visit_This;
    MAP data;           //记录储存数据
}Graph;
typedef struct Maze  //迷宫信息
{
    Point start;    //起点坐标
    Point end;      //终点坐标
    int d;
    Graph graph[MAXSIZE][MAXSIZE];    //迷宫结构信息
}Maze,*PMaze;

typedef int MAZE_MOVE(PMaze maze,Point* point);    //自定义变量

void Maze_Init(PMaze maze,MAP map[][MAXSIZE+1]);  //初始化迷宫
void Maze_Print(PMaze maze);                 //打印迷宫
void Maze_Print_Road(PList p,PMaze maze);    //打印路

void Maze_Find_Road(PMaze maze);            //寻找迷宫出口路径


MAZE_MOVE Maze_Move_Up;                //对四个方向的移动进行判断
MAZE_MOVE Maze_Move_Down;
MAZE_MOVE Maze_Move_Left;
MAZE_MOVE Maze_Move_Right;

MAZE_MOVE Maze_Judge_Win;              //判断是否找到终点

void Print_COM(void* p);               //自定义打印函数

int main()
{
    Maze maze={0};
    MAP map[MAXSIZE][MAXSIZE+1]=
    {
        {"**********"},
        {"*  **    *"},
        {"* *** ** *"},
        {"* **   * *"},
        {"* **   * *"},
        {"* **   * *"},
        {"*     ** *"},
        {"* ****** *"},
        {"*  ***** *"},
        {"**********"},
    };

    system("cls");
    Maze_Init(&maze,map);
    Maze_Print(&maze);
    Maze_Find_Road(&maze);

    return 0;
}

void Maze_Init(PMaze maze,MAP map[][MAXSIZE+1])  //初始化迷宫
{
    int i=0;
    int j=0;
    int k=0;

    maze->start.x=1;   //初始化起点坐标
    maze->start.y=1;   

    maze->end.x=8;     //初始化终点坐标
    maze->end.y=8;

    maze->d=sizeof(DISCOVER);

    for (i=0;i<MAXSIZE;++i)
        for (j=0;j<MAXSIZE;++j)
        {
            maze->graph[i][j].data=map[i][j];
            for (k=0;k<maze->d;++k)
                maze->graph[i][j].visit[k]=DISCOVER;

            maze->graph[i][j].visit_This=DISCOVER;   //表示该格没有走过
        }
}

void Maze_Print(PMaze maze)
{
    int i=0;
    int j=0;

    for (i=0;i<MAXSIZE;++i)
    {
        for (j=0;j<MAXSIZE;++j)
             putchar(maze->graph[i][j].data);

        puts("");
    }
}

void Maze_Find_Road(PMaze maze)          //寻找迷宫出口路径
{
    PList p=NULL;

    Point point=                         //获取起点坐标
    {
        maze->start.x,
        maze->start.y,
    };

    MAZE_MOVE *move[sizeof(DISCOVER)]={0};  //定义四个方向的指针函数数组

    int win=0;   //判断是否有出口

    move[UP]=Maze_Move_Up;
    move[DOWN]=Maze_Move_Down;
    move[LEFT]=Maze_Move_Left;
    move[RIGHT]=Maze_Move_Right;

    List_Fun.Creat_Link(&p,&point,sizeof(Point));    //创建一个栈
    List_Fun.Insert_Rear(p,&point);                  //起始坐标入栈
    maze->graph[point.x][point.y].visit_This=COVER;  //标记此坐标被遍历过

    printf("起点坐标:(%d,%d)\n",point.x,point.y);
    printf("终点坐标:(%d,%d)\n",maze->end.x,maze->end.y);
    while (!List_Fun.Empty_List(p))
    {
        int i=0;
        int len=sizeof(DISCOVER);

        for (i=0;i<len;++i)
        {                
            if (move[i](maze,&point)&&((win=Maze_Judge_Win(maze,&point))==0))
            {
                List_Fun.Insert_Rear(p,&point);                //入栈   
                i=-1;        
                //对新位置重新判断
            }

            if (win==1)
            {
                List_Fun.Insert_Rear(p,&point);
                break;
            }

        }

        if (win==1)
        {
            puts("深度搜索路线如下:");
            List_Fun.Println_List(p,Print_COM);   //输出链表数据
            break;
        }

        List_Fun.Del_Rear(p,&point);                         //出栈

    }

    if (List_Fun.Empty_List(p))
        puts("找不到出口!");
    else
        printf("共走了%d步\n",p->length);

    while (!List_Fun.Empty_List(p))
    {
        List_Fun.Remove_Front(p,&point);
        maze->graph[point.x][point.y].data='o';
    }

    if (win)
    {
        puts("请按任意键输出迷宫路线:");
        getch();
        Maze_Print(maze);
    }


    List_Fun.Del_List(&p,1);                         //释放栈
}

int Maze_Move_Up(PMaze maze,Point* point)    //自定义变量
{
    if (maze->graph[point->x][point->y].visit[UP]==COVER)
        return 0;

    if (point->x-1<0||maze->graph[point->x-1][point->y].data=='*')
        return 0;

    maze->graph[point->x][point->y].visit[UP]=COVER;
    maze->graph[point->x][point->y].visit_This=COVER;

    --point->x;

    maze->graph[point->x][point->y].visit[DOWN]=COVER;  //对返回路径进行处理

    return 1;
}

int Maze_Move_Down(PMaze maze,Point* point)    //自定义变量
{
    if (maze->graph[point->x][point->y].visit[DOWN]==COVER)
        return 0;

    if (point->x+1>MAXSIZE-1||maze->graph[point->x+1][point->y].data=='*'||maze->graph[point->x+1][point->y].visit_This==COVER)
        return 0;

    maze->graph[point->x][point->y].visit[DOWN]=COVER;
    maze->graph[point->x][point->y].visit_This=COVER;


    ++point->x;

    maze->graph[point->x][point->y].visit[UP]=COVER;

    return 1;
}


int Maze_Move_Left(PMaze maze,Point* point)    //自定义变量
{
    if (maze->graph[point->x][point->y].visit[LEFT]==COVER)
        return 0;

    if (point->y-1<0||maze->graph[point->x][point->y-1].data=='*'||maze->graph[point->x][point->y-1].visit_This==COVER)
        return 0;

    maze->graph[point->x][point->y].visit[LEFT]=COVER;
    maze->graph[point->x][point->y].visit_This=COVER;

    --point->y;

    maze->graph[point->x][point->y].visit[RIGHT]=COVER;

    return 1;
}

int Maze_Move_Right(PMaze maze,Point* point)    //自定义变量
{
    if (maze->graph[point->x][point->y].visit[RIGHT]==COVER)
        return 0;

    if (point->y+1>MAXSIZE-1||maze->graph[point->x][point->y+1].data=='*'||maze->graph[point->x][point->y+1].visit_This==COVER)
        return 0;

    maze->graph[point->x][point->y].visit[RIGHT]=COVER;
    maze->graph[point->x][point->y].visit_This=COVER;

    ++point->y;

    maze->graph[point->x][point->y].visit[LEFT]=COVER;

    return 1;
}

int Maze_Judge_Win(PMaze maze,Point* point)    //自定义变量
{
    if (maze->end.x==point->x&&maze->end.y==point->y)
    {
        return 1;
    }

    return 0;
}

void Print_COM(void* p)               //自定义打印函数
{
    int x=((Point* )p)->x;
    int y=((Point* )p)->y;

    printf("%-4d%-4d\n",x,y);
}


[此贴子已经被作者于2017-6-4 21:55编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-06-03 22:38
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
更新了一下代码~这个基本可以运行了~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-06-04 21:54
快速回复:求大神帮忙写一个求解迷宫的程序,用栈实现就可以
数据加载中...
 
   



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

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