数据结构与算法:广度寻路算法的C++实现

任务:初始化一个10*10的地图(利用整型变量模拟,1代表墙壁,0代表通路),给定起始位置和目标位置,利用广度寻路算法找到最短路径。

main.cpp代码如下:

#include <iostream>
#include <vector>

#define ROWS 10
#define COLS 10

using namespace std;

//枚举类型,表示探索方向
enum Direct { D_up, D_right, D_down, D_left};

//定义辅助地图标记点
struct Mark {
    int  val;        //整型变量  0表示通路,1表示墙壁
    bool bIsFind;    //该点位是否已被探索
};

//定义位置坐标
struct Pos
{
    int Row;     //所处行数
    int Col;     //所处列数
};

//定义寻路树结构
struct NodeTree {
    Pos                  MyPos = {0,0};         //自身位置坐标
    NodeTree*            pParent = NULL;        //父结点地址
    vector<NodeTree*>    pChild;                //孩子结点地址容器
};  

//创建新结点
NodeTree* CreateNewNode(int Row, int Col);


int main()
{
    //初始化原地图
    int Map[ROWS][COLS] =
    {
        {1,1,1,1,1,1,1,1,1,1},
        {1,0,1,1,1,1,1,1,1,1},
        {1,0,1,1,1,1,0,0,0,1},
        {1,0,0,0,1,1,0,1,0,1},
        {1,0,1,0,0,0,0,1,0,1},
        {1,0,0,0,1,1,0,1,0,1},
        {1,0,1,0,0,0,0,1,0,1},
        {1,0,1,0,1,1,0,1,0,1},
        {1,0,0,0,1,1,0,0,0,1},
        {1,1,1,1,1,1,1,1,1,1},
    };

    //初始化辅助地图
    Mark PathMap[ROWS][COLS] = { 0 };
    for (int i = 0; i < ROWS; i++)
    {
        for (int j = 0; j < COLS; j++)
        {
            PathMap[i][j].val = Map[i][j];
        }
    }

    //初始化起始位置和目标位置
    Pos SrcPos = { 1 , 1 };
    Pos DstPos = { 8 , 8 };

    //初始化寻路树,将起始位置设为根结点
    NodeTree* pRoot = NULL;
    pRoot = CreateNewNode(SrcPos.Row, SrcPos.Col);

    //当前结点位置
    Pos TempPos = SrcPos;
    PathMap[TempPos.Row][TempPos.Col].bIsFind = true;

    //初始化当前层
    vector<NodeTree*> pBuff;
    pBuff.push_back(pRoot);

    //临时结点
    NodeTree* TempNode = NULL;

    bool bFindPath = false;

    while (!bFindPath)
    {
        //初始化下一层
        vector<NodeTree*> pNextBuff;
        //探索每个孩子
        for (unsigned int i = 0; i < pBuff.size(); i++)
        {
            //探索每个方向
            for (int j = 0; j < 4; j++)
            {
                TempPos = pBuff[i]->MyPos;
                switch (j)
                { 
                case  D_up:     TempPos.Row--;  break;
                case  D_right:  TempPos.Col++;  break;
                case  D_down:   TempPos.Row++;   break;
                case  D_left:   TempPos.Col--;   break;
                }
                //如果通路未被探索
                if (PathMap[TempPos.Row][TempPos.Col].val == 0 && !PathMap[TempPos.Row][TempPos.Col].bIsFind)
                {
                    //则新增树结点加入树中
                    TempNode = CreateNewNode(TempPos.Row, TempPos.Col);
                    TempNode->pParent = pBuff[i];
                    pBuff[i]->pChild.push_back(TempNode);
                    //该位置标记为已探索
                    PathMap[TempPos.Row][TempPos.Col].bIsFind = true;
                    //将结点添加至下一层容器
                    pNextBuff.push_back(TempNode);
                    //cout << "(" << TempNode->MyPos.Row << "," << TempNode->MyPos.Col << ")" << endl;                
                }
                //如果当前坐标等于目标位置坐标,寻路成功,退出循环
                if (TempPos.Row == DstPos.Row && TempPos.Col == DstPos.Col)
                {
                    bFindPath = true;
                  //cout << "findpath"<<endl;
                    break;
                }
            }
            //寻路成功,退出循环
            if(bFindPath) break;
        }
        //寻路成功,退出循环
        if (bFindPath) break;
        //当前层移至下一层
        pBuff = pNextBuff;
    }
    //寻路成功则打印路径信息
    if (bFindPath && TempNode)
    {
        cout << "寻路成功,路径如下:" << endl;
        while (TempNode->pParent)
        {
            cout << "(" << TempNode->MyPos.Row << "," << TempNode->MyPos.Col << ")" << endl;
            TempNode = TempNode->pParent;
        }
        cout << "(" << TempNode->MyPos.Row << "," << TempNode->MyPos.Col << ")" << endl;
    }
    else
    {
        cout << "ERROR!" << endl;
    }

    return 0;
}


//创建新结点
NodeTree* CreateNewNode(int Row, int Col)
{
    NodeTree* pNew = new NodeTree;
    memset(pNew, 0, sizeof(NodeTree));
    pNew->MyPos.Col = Col;
    pNew->MyPos.Row = Row;
    return pNew;
}

程序运行结果如下:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值