解决当前正方形周围只有15x15网格视觉的迷宫(C ++)

时间:2017-04-18 22:57:29

标签: c++ depth-first-search

所以我写了一个程序,在最快的时间内解决了一个迷宫,但是你只能在你目前看到周围区域的地方给一个小区域。我本来打算这样做,以便它始终按照正确的顺序步骤>转发>左>>向后。为了使它更快,我打算添加一个检查路径的函数,看它是否会导致死胡同。是否可以进入某个方向由最后4位数表示。我尝试使用广度优先搜索算法来查找死角。该函数通过检查它是否在给定区域之外的步骤来工作,如果是,则返回false,否则返回true。我不完全确定它出了什么问题,但它肯定不起作用。该函数传递一个数组,该数组表示可见区域,区域的高度和宽度,x,y坐标以及它最初面向的方向表示为unsigned char。这是&用最后4位检查它是否可以向那个方向移动。任何帮助将不胜感激。

//WILL RETURN TRUE IF THERE IS A DEAD END, FALSE OTHERWISE
 bool ActualPlayer::deadEnd(const AdvancedMapTile* area, const uint width, const uint height, const uint x, const uint y, unsigned char dir)
{
//dynamic allocation
bool *marked = nullptr;
marked = new bool[height * width];
for(uint i = 0; i < (height * width) ; i++)
    marked[i] = false;
queue<cord> q;
bool deadEnd = true;
cord temp;

marked[x + y*width] = true;
temp.x = x;
temp.y = y;
q.push(temp);
//perform bfs
while(!q.empty())
{
    AdvancedMapTile loc = area[x + y*width];
    temp = q.front();
    q.pop();
    for(unsigned char i = 1; i < 9; i = i*2)//goes for 1, 2, 4, 8
    {
        uint tempx = temp.x;
        uint tempy = temp.y;
        changeXY(tempx, tempy, i, height, width);
        if(!marked[tempx + tempy*width] && (loc.exits & i) != 0)
        {
            q.push(temp);
            marked[tempx + tempy*width] = true;
            if(tempx < 0 || tempx == width || tempy < 0 || tempy == height)
                return false;
        }
    }
}

delete [] marked;
return deadEnd;

}

0 个答案:

没有答案