数据结构例程——迷宫问题(用队列)

  本文针对数据结构基础系列网络课程(3):栈和队列中第11课时队列的应用-迷宫问题

例:求出从入口到出口的路径

代码:

#include <stdio.h>
#define MaxSize 100
#define M 8
#define N 8
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,0,1,0,0,0,1,0,1},
    {1,0,0,0,0,1,1,0,0,1},
    {1,0,1,1,1,0,0,0,0,1},
    {1,0,0,0,1,0,0,0,0,1},
    {1,0,1,0,0,0,1,0,0,1},
    {1,0,1,1,1,0,1,1,0,1},
    {1,1,0,0,0,0,0,0,0,1},
    {1,1,1,1,1,1,1,1,1,1}
};
typedef struct
{
    int i,j;            //方块的位置
    int pre;            //本路径中上一方块在队列中的下标
} Box;                  //方块类型
typedef struct
{
    Box data[MaxSize];
    int front,rear;     //队头指针和队尾指针
} QuType;               //定义顺序队类型

void print(QuType qu,int front) //从队列qu中输出路径
{
    int k=front,j,ns=0;
    printf("\n");
    do              //反向找到最短路径,将该路径上的方块的pre成员设置成-1
    {
        j=k;
        k=qu.data[k].pre;
        qu.data[j].pre=-1;
    }
    while (k!=0);
    printf("迷宫路径如下:\n");
    k=0;
    while (k<=front)  //正向搜索到pre为-1的方块,即构成正向的路径
    {
        if (qu.data[k].pre==-1)
        {
            ns++;
            printf("\t(%d,%d)",qu.data[k].i,qu.data[k].j);
            if (ns%5==0)
                printf("\n");   //每输出每5个方块后换一行
        }
        k++;
    }
    printf("\n");
}
int mgpath(int xi,int yi,int xe,int ye)                 //搜索路径为:(xi,yi)->(xe,ye)
{
    int i,j,find=0,di;
    QuType qu;                      //定义顺序队
    qu.front=qu.rear=-1;
    qu.rear++;
    qu.data[qu.rear].i=xi;
    qu.data[qu.rear].j=yi;  //(xi,yi)进队
    qu.data[qu.rear].pre=-1;
    mg[xi][yi]=-1;                  //将其赋值-1,以避免回过来重复搜索
    while (qu.front!=qu.rear && !find)  //队列不为空且未找到路径时循环
    {
        qu.front++;                 //出队,由于不是环形队列,该出队元素仍在队列中
        i=qu.data[qu.front].i;
        j=qu.data[qu.front].j;
        if (i==xe && j==ye)         //找到了出口,输出路径
        {
            find=1;
            print(qu,qu.front);         //调用print函数输出路径
            return(1);              //找到一条路径时返回1
        }
        for (di=0; di<4; di++)      //循环扫描每个方位,把每个可走的方块插入队列中
        {
            switch(di)
            {
            case 0:
                i=qu.data[qu.front].i-1;
                j=qu.data[qu.front].j;
                break;
            case 1:
                i=qu.data[qu.front].i;
                j=qu.data[qu.front].j+1;
                break;
            case 2:
                i=qu.data[qu.front].i+1;
                j=qu.data[qu.front].j;
                break;
            case 3:
                i=qu.data[qu.front].i, j=qu.data[qu.front].j-1;
                break;
            }
            if (mg[i][j]==0)
            {
                qu.rear++;              //将该相邻方块插入到队列中
                qu.data[qu.rear].i=i;
                qu.data[qu.rear].j=j;
                qu.data[qu.rear].pre=qu.front; //指向路径中上一个方块的下标
                mg[i][j]=-1;        //将其赋值-1,以避免回过来重复搜索
            }
        }
    }
    return(0);                      //未找到一条路径时返回1
}
int main()
{
    mgpath(1,1,M,N);
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-07 17:28:29

数据结构例程——迷宫问题(用队列)的相关文章

数据结构例程——迷宫问题(用栈结构)

本文针对数据结构基础系列网络课程(3):栈和队列中第6课时栈的应用2-迷宫问题. 例:求出从入口到出口的路径 程序实现: #include <stdio.h> #define MaxSize 100 #define M 8 #define N 8 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,0,1,0,0,0,1,0,1}, {1,0,0,0,0,1,1,0,0,1}, {1,0,1,1,1,0,

SDUT 2449 数据结构实验之栈与队列十:走迷宫

数据结构实验之栈与队列十:走迷宫 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 一个由n * m 个格子组成的迷宫,起点是(1, 1), 终点是(n, m),每次可以向上下左右四个方向任意走一步,并且有些格子是不能走动,求从起点到终点经过每个格子至多一次的走法数. Input 第一行一个整数T 表示有T 组测试数据.(T <= 110) 对于每组测试数据: 第一行两个整数n, m,表示迷宫有n * m 个格子.(1

SDUT-2449_数据结构实验之栈与队列十:走迷宫

数据结构实验之栈与队列十:走迷宫 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 一个由n * m 个格子组成的迷宫,起点是(1, 1), 终点是(n, m),每次可以向上下左右四个方向任意走一步,并且有些格子是不能走动,求从起点到终点经过每个格子至多一次的走法数. Input 第一行一个整数T 表示有T 组测试数据.(T <= 110) 对于每组测试数据: 第一行两个整数n, m,表示迷宫有n * m 个格子.(1

西风的数据结构教程(2)——队列

队列是一种简单的先进先出结构,各种需要排队的事情,都可以开一个队列来完成. 利用链表或数组,都能实现队列,不过最大的区别就是,数组的扩展比较困难,而链表较为容易,但链表资源消耗稍多. 数据结构的不同导致了队列的实现也不相同,链表上次已经实现过了,只需简单包装即可使用,这里,我们介绍简单的用数组模拟队列的方式: 这个队列是固定长度的一个数组构建的,另外保存两个int数字,负责记录数组的下标索引. 我们下面就来编写一下这个队列,还是使用C语言,在此,我会继续介绍C语言的基础知识. 队列实现 复习一下

数据结构与算法--栈、队列(队列)

Hello,everybody.我们又见面了.今天我们来学习一下队列这个数据结构,let's Go,开始我们的征程吧. 首先,举两个生活中的常见例子.相信大家,在用电脑工作娱乐时,都会碰到这样的现象.当我们点击程序或进行其他操作时,电脑处于死机状态.正当我们准备Reset时,它突然像打了鸡血似的,突然把刚才我们的操作,按顺序执行了一遍.之所以会出现这个现象,是因为操作系统的多个程序,需要通过一个管道输出,而按先后顺序排队造成的. 还有有个例子,在我们打客服热线时,有时会出现等待的现象.当其他客户

4、蛤蟆的数据结构笔记之四栈和队列定义

4.蛤蟆的数据结构笔记之四栈和队列定义 本篇名言:"人生应该如蜡烛一样,从顶燃到底,一直都是光明的." 今天学习栈和队列了.从第二篇学习时候我们知道,其实也是线性表的一种. 我们先来看下定义. 欢迎转载,转载请标明出处: 1.  栈 栈(stack)又名堆栈,它是一种运算受限的线性表.其限制是仅允许在表的一端进行插入和删除运算.这一端被称为栈顶,相对地,把另一端称为栈底.向一个栈插入新元素又称作进栈.入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素:从一个栈删除元素又称

【数据结构】用C++编写队列及基本操作(包括插入,出队列,摧毁,清空等等)

//[数据结构]用C++编写队列及基本操作(包括插入,出队列,摧毁,清空等等) //头文件 #ifndef _SEQ_STACK_ #define _SEQ_STACK_ #include <iostream> using namespace std; template <class Type> class Queue { public: Queue(size_t sz = INIT_SIZE) { capacity = sz > INIT_SIZE ? sz : INIT_

SDUT-3335_数据结构实验之栈与队列八:栈的基本操作

数据结构实验之栈与队列八:栈的基本操作 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 堆栈是一种基本的数据结构.堆栈具有两种基本操作方式,push 和 pop.push一个值会将其压入栈顶,而 pop 则会将栈顶的值弹出.现在我们就来验证一下堆栈的使用. Input 首先输入整数t(1 <= t <= 10),代表测试的组数,以后是 t 组输入. 对于每组测试数据,第一行输入两个正整数 m(1 <= m &

SDUT-2088_数据结构实验之栈与队列十一:refresh的停车场

数据结构实验之栈与队列十一:refresh的停车场 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description refresh最近发了一笔横财,开了一家停车场.由于土地有限,停车场内停车数量有限,但是要求进停车场的车辆过多.当停车场满时,要进入的车辆会进入便道等待,最先进入便道的车辆会优先 进入停车场,而且停车场的结构要求只出去的车辆必须是停车场中最后进去的车辆.现告诉你停车场容量N以及命令数M,以及一些命令(Add num 表