KaiNen_ 2022-11-03 20:48 采纳率: 100%
浏览 53
已结题

A星寻优算法-出错(初学者不知道哪里的错误)

用代码块功能插入代码,请勿粘贴截图
#include<iostream>;
#include<vector>;
using namespace std;
//竖着    Y    行数
#define ROWS 9
//横着    X    列数
#define COLS 11

#define ZXDJ 10
#define XXDJ 14

//点的类型
struct MyPoint
{
    int row;
    int col;
    int f;
    int g;
    int h;
    void setF()
    {
        f = g + h;
    }
};

//树的节点类型
struct TreeNode
{
    MyPoint pos;                //当前点坐标
    vector<TreeNode*> childs;   //存储  当前点的孩子节点指针的数组
    TreeNode* pParent;          //存储  当前点的父节点指针的变量
};

enum direct
{
    p_up,p_down, p_left, p_right,p_lup,p_ldown,p_rup,p_rdown
};

//打印地图
void printMap(int map[ROWS][COLS]);

//计算h值:endPos:终点坐标  pos:当前点坐标
int getH(MyPoint endPos, MyPoint pos);

//判断是否需要统计
bool needAdd(MyPoint pos, int map[ROWS][COLS], bool pathMap[ROWS][COLS]);

int main()
{
    //1 构建地图   0->空地   1->障碍物
    int map[ROWS][COLS] = {
        {0,0,0,0,0,1,0,0,0,0,0},
        {0,0,0,0,0,1,0,0,0,0,0},
        {0,0,0,0,0,1,0,0,0,0,0},
        {0,0,0,0,0,1,0,0,0,0,0},
        {0,0,0,0,0,1,0,0,0,0,0},
        {0,0,0,0,0,1,0,0,0,0,0},
        {0,0,0,0,0,1,0,0,0,0,0},
        {0,0,0,0,0,0,0,0,0,0,0},
        {0,0,0,0,0,1,0,0,0,0,0},
    };

    //2 辅助地图      false:0->:没有走过      true:1->走过
    bool pathMap[ROWS][COLS] = { 0 };

    //3 起点  终点
    MyPoint begPos = { 2,2 };
    MyPoint endPos = { 4,8 };

    //4 标记起点走过
    pathMap[begPos.row][begPos.col] = true;

    //5 创建一棵树,起点是树的根节点

    //创建一个新节点
    TreeNode* pNew = new TreeNode;
    memset(pNew, 0, sizeof TreeNode);

    //新节点成为树根
    //pRoot一直指向树的根节点
    TreeNode* pRoot = pNew;

    //新节点是记录起点
    pRoot->pos = begPos;

    //6 需要一个动态数组  存储用来比较的节点
    vector<TreeNode*> buff;

    //7 寻路
    //MyPoint currentPos = begPos;
    TreeNode* pCurrent = pRoot;
    TreeNode* pChild = NULL;

    //迭代器
    vector<TreeNode*>::iterator it;
    vector<TreeNode*>::iterator itMin;

    bool isFindEnd = false;

    while (1)
    {
        //7.1 找到当前点周围能走的节点
        for (int i = 0; i < 8; i++)
        {
            pChild = new TreeNode;
            memset(pChild, 0, sizeof TreeNode);
            pChild->pos = pCurrent->pos;

            switch (i)
            {
            case p_up:
                pChild->pos.row = pCurrent->pos.row - 1;
                pChild->pos.g += ZXDJ;
                break;
            case p_down:
                pChild->pos.row = pCurrent->pos.row + 1;
                pChild->pos.g += ZXDJ;
                break;
            case p_left:
                pChild->pos.col = pCurrent->pos.col - 1;
                pChild->pos.g += ZXDJ;
                break;
            case p_right:
                pChild->pos.col = pCurrent->pos.col + 1;
                pChild->pos.g += ZXDJ;
                break;
            case p_lup:
                pChild->pos.row = pCurrent->pos.row - 1;
                pChild->pos.col = pCurrent->pos.col - 1;
                pChild->pos.g += XXDJ;
                break;
            case p_ldown:
                pChild->pos.row = pCurrent->pos.row + 1;
                pChild->pos.col = pCurrent->pos.col - 1;
                pChild->pos.g += XXDJ;
                break;
            case p_rup:
                pChild->pos.row = pCurrent->pos.row - 1;
                pChild->pos.col = pCurrent->pos.col + 1;
                pChild->pos.g += XXDJ;
                break;
            case p_rdown:
                pChild->pos.row = pCurrent->pos.row + 1;
                pChild->pos.col = pCurrent->pos.col + 1;
                pChild->pos.g += XXDJ;
                break;
            default:
                break;
            }
            /*
            测试
            cout <<"(" << pChild->pos.row <<"," <<pChild->pos.col <<"),g:" <<pChild->pos.g << endl;
            */
            //7.2 计算g h f的值
            pChild->pos.h = getH(endPos, pChild->pos);
            pChild->pos.setF();
            //7.3 入树,入buff数组,标记走过
            if (needAdd(pChild->pos, map, pathMap))
            {
                //入树
                pCurrent->childs.push_back(pChild);
                pChild->pParent = pCurrent;

                //入buff数组
                buff.push_back(pChild);

                //标记走过
                pathMap[pChild->pos.row][pChild->pos.col] = true;
            }
            else
            {
                delete pChild;
            }
        }
        //7.4 从buff数组中找出f值最小的那个
        itMin = buff.begin();
        for (it = buff.begin(); it != buff.end(); it++)
        {
            if ((*itMin)->pos.f > (*it)->pos.f)
            {
                itMin = it;
            }
        }
        //7.5 删掉,变化成当前点
        pCurrent = *itMin;
        buff.erase(itMin);
        //7.6 判断是否寻路结束
        if (pCurrent->pos.row == endPos.row && pCurrent->pos.col == endPos.col)
        {
            isFindEnd = true;
            break;
        }
        if (buff.empty())
        {
            break;
        }
    }
    if (isFindEnd)
    {
        cout << "找到终点了!!" << endl;
        while (pCurrent)
        {
            cout << "(" << pCurrent->pos.row << "," << pCurrent->pos.col << ")";
            pCurrent = pCurrent->pParent;
        }
        cout << endl;
    }

    printMap(map);

    while (1);
    return 0;
}

bool needAdd(MyPoint pos, int map[ROWS][COLS], bool pathMap[ROWS][COLS])
{
    //判断是否在范围内
    if (pos.row >= ROWS || pos.row < 0
        || pos.col >= COLS || pos.col < 0)
    {
        return false;
    }
    //判断是否走过
    if (map[pos.row][pos.col]==1)
    {
        return false;
    }
    //判断是否为障碍物
    if (pathMap[pos.row][pos.col] == true)
    {
        return false;
    }
    return true;
}

int getH(MyPoint endPos, MyPoint pos)
{
    int x, y;
    if (endPos.col > pos.col)
    {
        x = endPos.col - pos.col;
    }
    else
    {
        x = pos.col - endPos.col;
    }
    if (endPos.row > pos.row)
    {
        y = endPos.row - pos.row;
    }
    else
    {
        y = pos.row - endPos.row;
    }
    return(x + y) * ZXDJ;
}

void printMap(int map[ROWS][COLS])
{
    for (int i = 0; i < ROWS; i++)
    {
        for (int j = 0; j < COLS; j++)
        {
            if (map[i][j] == 0)
            {
                cout << " * ";
            }
            else
            {
                cout << " | ";
            }
        }
        cout << endl << endl;
    }
}


运行结果及报错内容

img

  • 写回答

3条回答 默认 最新

  • 这次真没糖 2022-11-04 09:18
    关注

    为什么不发一下报错的那一行,

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 11月13日
  • 已采纳回答 11月5日
  • 创建了问题 11月3日

悬赏问题

  • ¥15 linux驱动,linux应用,多线程
  • ¥20 我要一个分身加定位两个功能的安卓app
  • ¥15 基于FOC驱动器,如何实现卡丁车下坡无阻力的遛坡的效果
  • ¥15 IAR程序莫名变量多重定义
  • ¥15 (标签-UDP|关键词-client)
  • ¥15 关于库卡officelite无法与虚拟机通讯的问题
  • ¥15 目标检测项目无法读取视频
  • ¥15 GEO datasets中基因芯片数据仅仅提供了normalized signal如何进行差异分析
  • ¥100 求采集电商背景音乐的方法
  • ¥15 数学建模竞赛求指导帮助