求简单迷宫的路径

22 篇文章 2 订阅
6 篇文章 0 订阅

简单迷宫


  1. 设置一个简单迷宫。(6*6)
    这里写图片描述

  2. 定义迷宫入口。
      迷宫入口要求:必须是边界。
    这里写图片描述
    3.开始走迷宫
      a. 走当前步: 当前步入栈,将当前步标记为2
      b. 判断当前栈顶元素是否是出口(是边界却不是入口),如果是就返回,若不是之星下一步。
      c.取栈顶元素为当前步:
      d.走下一步:
        假设优先顺序为上,左,右,下。
      上:(横坐标减1,纵坐标不变)
         判断是否是通路(即此处是否是1)
           如果是通路,则走此步 ,此步入栈,将当前步标为2。
      左:(纵坐标减1,横坐标不变)
         判断是否是通路(即此处是否是1)
           如果是通路,则走此步 ,此步入栈,将当前步标为2。
      右:(纵坐标加1,横坐标不变)
        判断是否是通路(即此处是否是1)
          如果是通路,则走此步 ,此步入栈,将当前步标为2。
      下:(横坐标减1,纵坐标不变)
        判断是否是通路(即此处是否是1)
          如果是通路,则走此步 ,此步入栈,将当前步标为2。
    如果上下左右均不是通路,则证明此步走错。应该回退到上一步重新找路径(栈顶元素出栈)。循环执行b,c,d直至遇到出口为止。


迷宫具体分析:

这里写图片描述


  我们需要一个存放路径的栈,由于此栈存放的是路径,路径有横纵坐标,所以也需要一个结构体去实现。

//横纵坐标的值
typedef struct position
{
    int x;
    int y;
}position;

//静态栈,用于存储路径
typedef struct  stack
{
    position data[20];
    int top;
}stack;

                                整体代码:

.h文件

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>

#define ROW  6
#define COL  6

//横纵坐标的值
typedef struct position
{
    int x;
    int y;
}position;

//静态栈,用于存储路径
typedef struct  stack
{
    position data[20];
    int top;
}stack;


//初始化栈
void InitStack(stack *s);

//走迷宫
void PassMaze(int Maze[ROW][COL],position enter,stack* s);

//打印迷宫
void print(int Maze[ROW][COL]);

//打印迷宫路径
void printStack(stack *s);

.c文件

#include"Maze.h"

//初始化栈
void InitStack(stack *s)
{
    assert(s);
    s->top = 0;
    memset(s->data, 0, 20 * sizeof(position));
}
//入栈
void  PushStack(stack *s, position cur)
{
    assert(s);
    s->data[s->top] = cur;
    s->top++;
}
//栈顶元素
position TopStack(stack *s)
{
    assert(s);
    return s->data[s->top - 1];
}
//栈顶元素出栈
void PopStack(stack *s)
{
    assert(s);
    s->top--;
}
//判断是入口吗?
int IsEnter(int Maze[ROW][COL], position enter)
{
    //边界
    if (enter.x == 0 || enter.x == ROW - 1 || enter.y == 0 || enter.y == COL - 1)
    {
        return 1;
    }
    else
        return 0;
}
//是通路吗?
int IsPass(int Maze[ROW][COL], position next)
{
    //1.坐标有效
    if (next.x >= 0 && next.x < ROW && next.y >= 0 && next.y < COL )
    {
        //2.是通路
        if (1 == Maze[next.x][next.y])
        {
            return 1;
        }
    }
    return 0;
}
//是出口吗?
int IsExit(int Maze[ROW][COL], position enter, position cur)
{
    if ((cur.x == 0 || cur.x == ROW - 1 || cur.y == 0 || cur.y == COL - 1) && (cur.x != enter.x || cur.y != enter.y))
    {
        return 1;
    }
    return 0;
}

//走迷宫
void PassMaze(int Maze[ROW][COL], position enter, stack* s)
{
    position cur;
    position next; 
    if (IsEnter(Maze, enter))
    {
        cur = enter;
        //入口入栈
        PushStack(s, cur);
        //为防止重复走,将走过的路标记
        Maze[cur.x][cur.y] = 2;
        //如果不是出口,继续。。。。
        while (!IsExit(Maze, enter,TopStack(s)))
        {
            //cur为当前的栈顶元素
            cur = TopStack(s);
            //上通,从上走,标记
            next = cur;
            next.x = cur.x - 1;
            if (IsPass(Maze, next))
            {
                PushStack(s, next);
                Maze[next.x][next.y] = 2;
                continue;
            }
            //左通,从左走,标记
            next = cur;
            next.y = cur.y - 1;
            if (IsPass(Maze, cur))
            {
                PushStack(s, next);
                Maze[next.x][next.y] = 2;
                continue;
            }
            //右通,从右走,标记
            next = cur;
            next.y = cur.y + 1;
            if (IsPass(Maze, next))
            {
                PushStack(s, next);
                Maze[cur.x][next.y] = 2;
                continue;
            }
            //下通,从下走,标记
            next = cur;
            next.x = cur.x + 1;
            if (IsPass(Maze, next))
            {
                PushStack(s, next);
                Maze[next.x][next.y] = 2;
                continue;
            }
            //若上左右下均不是通路,证明该步走错,回退,且标记
            //栈顶元素出栈
            PopStack(s);
            Maze[cur.x][cur.y] = 3;
        }
        }
}
//打印迷宫
void print(int Maze[ROW][COL])
{
    int i = 0;
    int j = 0;
    for (i = 0; i < ROW; i++)
    {
        for (j = 0; j < COL; j++)
        {
            printf("%d ", Maze[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}

//打印迷宫路径
void printStack(stack *s)
{
    int i = 0;
    printf("迷宫路径为:\n");
    for (i = 0; i < s->top; i++)
    {
        printf("(%d,%d)  ", s->data[i].x,s->data[i].y);
    }
    printf("\n");
}

测试文件

#include"Maze.h"

void TestMaze()
{
    //设置一个地图的二位数组
    int Maze[ROW][COL] = { { 0, 0, 0, 0, 0, 0 },
                           { 0, 0, 1, 0, 0, 0 }, 
                           { 0, 0, 1, 0, 0, 0 },
                           { 0, 0, 1, 1, 1, 0 }, 
                           { 0, 0, 1, 0, 1, 1 },
                           { 0, 0, 1, 0, 0, 0 } };
    position enter;
    //定义栈,用于存放路径
    stack s;
    //打印迷宫
    print(Maze);
    //初始化栈
    InitStack(&s);
    //定义一个迷宫入口
    enter.x = 5;
    enter.y = 2;
    //走迷宫
    PassMaze(Maze, enter, &s);
    //打印迷宫
    print(Maze);
    //打印迷宫路径
    printStack(&s);
}

int main()
{
    TestMaze();
    system("pause");
    return 0;
}

运行:
这里写图片描述

问题描述: 以一个m*n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫出从入口(0,0)到出口(m-1,n-1)的通路和通路总数,或得出没有通路的结论。例如下图, 0(入口) 1 0 1 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0(出口) 从入口到出口有6条不同的通路。 而下图: 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 1 1 0 1 0 1 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 1 1 1 1 0 0 1 1 1 0 0 0 1 0 1 1 1 0 0 0 0 0 0 从入口到出口则没有通路。 算法设计: 给定一个m*n的长方阵表示迷宫,设计算法输出入口到出口的通路和通路总数,或得出没有通路的结论。 算法提示: 和皇后问题与分书问题类似。可以用二维数组存储迷宫数据,对于迷宫中任一位置,均可约定有东、南、西、北四个方向可通。从当前位置a(用(x,y)表示一个位置,假定它是以向右的x轴和向下的y轴组成的平面上的一个点)出发依次尝试四个方向是否有路,若某个方向的位置b可通,则按照同样的方法继续从b出发寻找。若到达出口,则找到一条通路。 数据输入: 由文件input.txt 提供输入数据。第一行是m和n的值,空格分隔,其后共m行。每行有n个数字,数和数之间用空格分隔。 结果输出: 将计算出的所有从入口到出口的通路输出到文件output.txt 中。若没有通路,则将0写入文件中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值