`
chemingliang
  • 浏览: 134780 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

数据结构:栈应用_求解迷宫问题2

阅读更多

/************************************************************************/

/* 数据结构:栈应用:求解迷宫问题                                                                   */

/* 挑灯看剑-shuchangs@126.com 2010-10                                                             */

/* 云歌国际(Cloud Singers International www.cocoral.com                          */

/************************************************************************/

//上接版面 《数据结构:栈应用_求解迷宫问题1》

 

 

/************************************************************************/

/* 以下为迷宫求解问题                                                                                 */

/************************************************************************/

 

void mazeExperiment()

{

       void printMatrix(int (*mtx)[9], int m, int n);

       void printMzePath(Stack S, int (*mtx)[9], int m, int n);

       static Status visa(CurPos* foot, char direction);

       static void step(CurPos* END, CurPos* foot, Stack* stack, Node* node);

 

       //定义迷宫矩阵,1表示通行,0表示禁止

       //约定迷宫矩阵四壁均为禁止

       int mtx[9][9] =

       {

              {0,0,0,0,0,0,0,0,0},

              {0,1,1,0,1,1,0,1,0},

              {0,1,1,0,1,1,0,1,0},

              {0,1,1,1,1,0,1,1,0},

              {0,1,0,0,0,1,1,1,0},

              {0,1,1,0,0,1,0,1,0},

              {0,1,0,1,1,1,0,1,0},

              {0,1,1,1,1,0,0,1,0},

              {0,0,0,0,0,0,0,0,0}

       };

 

       Stack stack =

       {

              0, NULL, NULL

       };  //定义一个空栈

 

       Node node =

       {

              NULL, NULL, NULL

       };  //用来返回出栈元素

 

       CurPos* foot, * start, * end;//定义足迹指针,开始指针和结束指针

 

       CurPos footprint[9][9];//定义一个足迹矩阵

       int m = 9;//足迹矩阵行数

       int n = 9;//足迹矩阵列数

       COUNT i, j;//足迹坐标

 

       //初始化足迹矩阵

       for (i = 0; i <= m - 1; i++)

       {

              for (j = 0; j <= n - 1; j++)

              {

                     footprint[i][j].data = mtx[i][j];

                     footprint[i][j].visited = FALSE;

                     footprint[i][j].x = i;

                     footprint[i][j].y = j;

                     if (i == 0 && j == 0) //左上顶点

                     {

                            footprint[i][j].up = NULL;

                            footprint[i][j].down = &footprint[i + 1][j];

                            footprint[i][j].left = NULL;

                            footprint[i][j].right = &footprint[i][j + 1];

                     }

                     else if (i == 0 && j == n - 1) //右上顶点

                     {

                            footprint[i][j].up = NULL;

                            footprint[i][j].down = &footprint[i + 1][j];

                            footprint[i][j].left = &footprint[i][j - 1];

                            footprint[i][j].right = NULL;

                     }

                     else if (i == m - 1 && j == 0) //左下顶点

                     {

                            footprint[i][j].up = &footprint[i - 1][j];

                            footprint[i][j].down = NULL;

                            footprint[i][j].left = NULL;

                            footprint[i][j].right = &footprint[i][j + 1];

                     }

                     else if (i == m - 1 && j == n - 1) //右下顶点

                     {

                            footprint[i][j].up = &footprint[i - 1][j];

                            footprint[i][j].down = NULL;

                            footprint[i][j].left = &footprint[i][j - 1];

                            footprint[i][j].right = NULL;

                     }

                     else if (i == 0 && j != 0 && j != n - 1) //上边框

                     {

                            footprint[i][j].up = NULL;

                            footprint[i][j].down = &footprint[i + 1][j];

                            footprint[i][j].left = &footprint[i][j - 1];

                            footprint[i][j].right = &footprint[i][j + 1];

                     }

                     else if (i == m - 1 && j != 0 && j != n - 1) //下边框

                     {

                            footprint[i][j].up = &footprint[i - 1][j];

                            footprint[i][j].down = NULL;

                            footprint[i][j].left = &footprint[i][j - 1];

                            footprint[i][j].right = &footprint[i][j + 1];

                     }

                     else if (j == 0 && i != 0 && i != m - 1) //左边框

                     {

                            footprint[i][j].up = &footprint[i - 1][j];

                            footprint[i][j].down = &footprint[i + 1][j];

                            footprint[i][j].left = NULL;

                            footprint[i][j].right = &footprint[i][j + 1];

                     }

                     else if (j == n - 1 && i != 0 && i != m - 1) //右边框

                     {

                            footprint[i][j].up = &footprint[i - 1][j];

                            footprint[i][j].down = &footprint[i + 1][j];

                            footprint[i][j].left = &footprint[i][j - 1];

                            footprint[i][j].right = NULL;

                     }

                     else //中间元素

                     {

                            footprint[i][j].up = &footprint[i - 1][j];

                            footprint[i][j].down = &footprint[i + 1][j];

                            footprint[i][j].left = &footprint[i][j - 1];

                            footprint[i][j].right = &footprint[i][j + 1];

                     }

              }

       }

 

       start = &footprint[1][1]; //定义起始指针和结束指针,并初始化

       end = &footprint[7][7];

       foot = start;                  //令足迹指针初始指向起始指针

       foot->visited = 1;                //令访问标记为已访问

       StackIn(&stack, *foot);       //当前足迹入栈

       printMzePath(stack, mtx, 9, 9);

       //迷宫遍历规则:每个格子紧挨四个格子,定义为上-下,左-右,按照从右开始、顺时针方向遍历格子

       step(end, foot, &stack, &node); //调用回调函数

       StackPrint(stack, 'B'); //打印栈(迷宫路径)

       printMzePath(stack, mtx, 9, 9);

}

static void step(CurPos* END, CurPos* foot, Stack* stack, Node* rtnNode)

{

       if (foot == END)

       {

              puts("迷宫求解结束!");

       }

       else if (stack->len == 0)

       {

              puts("迷宫求解失败!");

       }

       else if (visa(foot, 'R')) //如果右侧可行,先遍历右方向

       {

              foot->visited = 1; //当前足迹已访问

              StackIn(stack, *foot); //当前足迹入栈

              //StackPrint(*stack, 'B');

              foot = foot->right; //向右前进一步

              step(END, foot, stack, rtnNode);

       }

       else if (visa(foot, 'D'))

       {

              foot->visited = 1;

              StackIn(stack, *foot);

              //StackPrint(*stack, 'B');

              foot = foot->down;

              step(END, foot, stack, rtnNode);

       }

       else if (visa(foot, 'L'))

       {

              foot->visited = 1;

              StackIn(stack, *foot);

              //StackPrint(*stack, 'B');

              foot = foot->left;

              step(END, foot, stack, rtnNode);

       }

       else if (visa(foot, 'U'))

       {

              foot->visited = 1;

              StackIn(stack, *foot);

              //StackPrint(*stack, 'B');

              foot = foot->up;

              step(END, foot, stack, rtnNode);

       }

       else

       {

              foot->visited = 1;

              StackOut(stack, rtnNode); //出栈一位,删除栈顶

              foot = &(rtnNode->data); //foot指针退回到删除结点位置

              //printf("删除结点 foot[%d][%d] = %d\n", foot->x, foot->y,foot->data);

              //StackPrint(*stack, 'B');

              step(END, foot, stack, rtnNode);

       }

}

 

static Status visa(CurPos* foot, char direction)

{

       Status status = FALSE;

       switch (direction)

       {

       case 'L':

              //如果左结点的值可通行,且未被访问

              if (foot->left->data == 1 && foot->left->visited == 0)

                     status = TRUE;

              break;

       case 'R':

              if (foot->right->data == 1 && foot->right->visited == 0)

                     status = TRUE;

              break;

       case 'U':

              if (foot->up->data == 1 && foot->up->visited == 0)

                     status = TRUE;

              break;

       case 'D':

              if (foot->down->data == 1 && foot->down->visited == 0)

                     status = TRUE;

              break;

       default:

              break;

       }

       return status;

}

 

 

void printMatrix(int (*mtx)[9], int m, int n)

{

       COUNT i, j;

       printf("矩阵信息:%d行,%d列!\n", m, n);

       for (i = 0; i < m; i++)

       {

              printf("row=%d   ", i);

              for (j = 0; j < n; j++)

              {

                     printf(" %d ", *(*(mtx + i) + j));

              }

              printf("\n");

       }

}

 

//下接版面 《数据结构:栈应用:求解迷宫问题3》

分享到:
评论

相关推荐

    数据结构-栈的应用-迷宫求解

    在本主题“数据结构-栈的应用-迷宫求解”中,我们将探讨如何利用栈来解决迷宫路径搜索的问题。 首先,迷宫求解是一个典型的图遍历问题,可以通过深度优先搜索(DFS)或广度优先搜索(BFS)等算法来解决。在这里,...

    数据结构上机实验_栈和队列的应用_迷宫问题 (含代码和报告)

    **实验背景**:本实验旨在加深学生对数据结构中栈和队列的理解,并通过实际编程应用的方式掌握这两种数据结构的特点及其应用场景。栈和队列作为两种基本的数据结构,在算法设计、程序开发等多个领域都有着广泛的应用...

    《数据结构》上机实验报告—利用栈实现迷宫求解.pdf

    实验中,我们将首先实现一个以链表作为存储结构的栈类型,然后编写一个求解迷宫的非递归程序。 一、实验目的和要求 实验目的: * 应用栈结构来解决应用问题,加深对栈结构特点的认识和应用。 基本要求: * 首先...

    C语言数据结构顺序栈之迷宫求解

    本主题聚焦于“C语言数据结构顺序栈之迷宫求解”,这是一个结合了基本数据结构和算法的有趣应用。我们将深入探讨顺序栈、迷宫问题以及如何使用C语言实现迷宫求解算法。 顺序栈是一种线性数据结构,它的元素按照...

    C语言数据结构用队列求解迷宫最短路径

    从给定的代码片段来看,这是一段使用C语言实现迷宫最短路径求解的程序,主要通过队列(Queue)与栈(Stack)的数据结构来完成算法的设计与实现。下面将对这段代码涉及的关键知识点进行详细解析。 ### C语言中的数据...

    迷宫问题实验报告用栈解决迷宫问题

    总结,本实验报告详细阐述了如何使用栈来解决迷宫问题,涵盖了从需求分析到详细设计的全过程,以及关键数据结构栈的实现。通过迷宫生成、路径查找等模块,展示了如何利用栈进行深度优先搜索来解决实际问题。

    栈的应用 - 迷宫求解

    总之,“栈的应用 - 迷宫求解”是一个极好的学习资源,它将理论与实践相结合,帮助学生将数据结构的知识应用于实际问题,提升其编程和算法设计能力。通过对压缩包中的“maze”文件进行分析和实现,可以加深对栈和...

    数据结构课程设计_迷宫求解.doc

    迷宫求解是数据结构课程设计中一个典型的问题,旨在训练学生对递归和回溯等算法的理解和应用。在本设计中,我们将探讨两种方法来解决这一问题:非递归算法和递归算法。 一、问题描述 迷宫求解的基本任务是从入口...

    数据结构-栈的应用(迷宫求解)

    数据结构中的栈是一种非常重要的抽象数据类型,它遵循“后进先出”(LIFO,Last In First Out)的原则。在解决实际问题时,栈的特性往往被巧妙地利用,例如在迷宫求解的问题中。本文将深入探讨栈如何应用于迷宫求解...

    labyrinth-java.rar_Java 数据结构_Java 迷宫_数据结构 java_迷宫 java_迷宫算法

    这个项目可以帮助我们深入理解如何利用Java来处理和解决复杂的数据结构问题,特别是与迷宫相关的路径寻找算法。 首先,我们要了解什么是迷宫。迷宫是一种复杂的问题空间,通常由一系列相互连接的通道构成,具有起点...

    C语言数据结构顺序栈之迷宫求解最短路径

    总结来说,C语言数据结构中的顺序栈在迷宫求解最短路径问题中发挥着核心作用。通过对顺序栈的理解和熟练运用,我们可以设计高效的算法解决实际问题。对于学习者而言,深入理解和实践这部分内容将对提升编程技能和...

    Java编写的求解迷宫问题的小程序.zip_Java 迷宫_java小程序_java迷宫_迷宫java_迷宫问题

    - **深度优先搜索(DFS)**:通过栈数据结构进行回溯,从起点开始,不断探索迷宫的未访问区域,直到找到终点或无法前进时回溯。 - **广度优先搜索(BFS)**:使用队列数据结构,从起点开始,逐层遍历迷宫,优先探索...

    数据结构课程设计迷宫问题求解 c

    在数据结构课程设计中,迷宫问题的求解是一个经典的实践课题,它涉及到深度优先搜索(DFS)、广度优先搜索(BFS)等算法。在这个项目中,我们使用C语言作为编程工具,并在VC++6.0开发环境中进行实现。 迷宫问题的基本...

    数据结构(Java)迷宫实现

    在数据结构的学习中,迷宫问题是一个经典的算法挑战,它涉及到路径寻找、图遍历以及栈数据结构的应用。本文将详细解析如何使用Java语言,基于栈结构来解决此类问题。 首先,我们需要理解栈(Stack)的基本概念。栈...

    数据结构之栈--迷宫求解

    在本话题中,我们将深入探讨数据结构之一——栈,并以其在解决“走迷宫”问题中的应用为例进行讲解。 栈是一种特殊的线性数据结构,遵循“后进先出”(LIFO)原则,类似于日常生活中的叠盘子。栈的主要操作有压入...

    数据结构课程设计迷宫求解

    数据结构课程设计中的“迷宫求解”是一个典型的图遍历问题,主要涉及到栈这一数据结构的应用。在计算机科学中,迷宫可以被视为一个二维矩阵,每个节点代表一个位置,而边则表示相邻的位置。迷宫求解的目标是从起点到...

    数据结构之迷宫求解c++

    通过以上分析可以看出,“数据结构之迷宫求解C++”主要涵盖了栈这一关键数据结构及其在迷宫求解中的应用。栈作为深度优先搜索算法的基础,使得程序能够有效地管理和追踪探索过程中的路径信息。此外,迷宫的表示方法...

    《数据结构》-李春葆 实验报告-栈与队列的应用-求解迷宫路径问题

    "数据结构-栈与队列的应用-求解迷宫路径问题" 在这篇实验报告中,我们主要讨论了栈和队列的应用在解决迷宫路径问题方面的实践。我们将详细介绍实验的设计人员相关信息、实验目的与要求、实验内容、实验步骤与过程等...

    迷宫求解算法数据结构c语言

    从给定的代码片段和描述来看,这是一段用C语言实现的迷宫求解算法,涉及到了数据...通过对代码的理解,不仅能够掌握迷宫求解的基本思路,还能深入理解栈在实际问题中的应用,这对于学习数据结构和算法具有重要的意义。

Global site tag (gtag.js) - Google Analytics