如果可能,使用递归

时间:2015-09-13 17:50:38

标签: c++ algorithm

给出一个大小为R X C的网格,以及由零和一组成的网格中人物的startPosition和endPosition。现在我想找到从起始位置到结束位置的路径,并通过标记它们来跟踪网格上标记的路径2.如果路径不可行,我需要告诉该路径是不可能的。所以我写了这个逻辑:

vector<vector<int>> solution;
void printSolution(vector<vector<int>> grid)
{
for (int i=0;i<grid.size();i++)
{
    for (int j=0;j<grid[i].size();j++)
        cout<<grid[i][j]<<" ";
    cout<<endl;
}
}

bool isSafe(vector<vector<int>> grid, pair<int,int> position)
{
if(position.first >= 0 && position.first < grid.size() &&
   position.second >= 0 && position.second < grid[0].size() &&
   grid[position.first][position.second] == 0)
    return true;

return false;
}

bool checkPath(vector<vector<int>> grid,pair<int,int> currentPosition,pair<int,int> endPosition){
if(currentPosition == endPosition)
{
    solution[currentPosition.first][currentPosition.second] = 2;
    return true;
}
if(isSafe(grid,currentPosition) == true)
{
    solution[currentPosition.first][currentPosition.second] = 2;
    if (checkPath(grid, make_pair(currentPosition.first+1,currentPosition.second),endPosition) == true)
        return true;
    if (checkPath(grid, make_pair(currentPosition.first-1,currentPosition.second),endPosition) == true)
        return true;
    if (checkPath(grid, make_pair(currentPosition.first,currentPosition.second+1),endPosition) == true)
        return true;
    if (checkPath(grid, make_pair(currentPosition.first,currentPosition.second-1),endPosition) == true)
        return true;
    solution[currentPosition.first][currentPosition.second] = 0;
    return false;
}

return false;
}

bool solver(vector<vector<int>> grid,pair<int,int> startPosition,pair<int,int> endPosition,int R,int C){
solution.resize(R,vector<int>(C));
bool isPath = checkPath(grid,startPosition,endPosition);
printSolution(solution);
if(isPath==false){
    cout<<"No Path Found"<<endl;
    return false;
}
else{
    cout<<"Path Found"<<endl;
    return true;
}
}

此代码给出了分段错误。请帮忙找到它。我被困了将近一整天才找到它的存在。

帮助我纠正代码的逻辑。假设我有以下字段:

int R,C;
int grid[R][C];
pair<int,int> startPosition;
pair<int,int> endPosition;

此递归运行无限。我检查了一个简单的情况,其中startPosition为(1,0),endPosition为(2,2),R = 3且C = 3,网格为:

1 1 1
0 0 1
1 0 0

首先,我尝试使用BFS,然后开始进行递归解决方案。

1 个答案:

答案 0 :(得分:0)

在实现BFS路径查找算法时,有一个阴影数组可以跟踪所有被访问节点与原点的距离。

int distance[R][C];

最初,将所有距离设置为-1以指示尚未访问该位置。然后将原点的距离设置为0,并将原点推到堆栈上。

当堆栈不为空时,从堆栈中弹出一个项目。对于每个相邻位置(尚未访问过的位置),设置该位置的距离,并推送该位置。

当您到达结束位置时,您可以通过向后工作找到路径。知道最后位置的距离,路径上的前一个点是已访问的相邻位置,并且距离较短。