所以我写了一个程序,在最快的时间内解决了一个迷宫,但是你只能在你目前看到周围区域的地方给一个小区域。我本来打算这样做,以便它始终按照正确的顺序步骤>转发>左>>向后。为了使它更快,我打算添加一个检查路径的函数,看它是否会导致死胡同。是否可以进入某个方向由最后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;
}