C++ 递归函数和查找所有可能路径的问题

C++ 递归函数和查找所有可能路径的问题,c++,function,recursion,C++,Function,Recursion,我试图打印出从a到L都有车站的地铁系统中所有可能的路径。换句话说,目标是找出一个人可以走多少条可能的路径通过地铁系统,而不必多次越过轨道。我知道有640条可能的路径,因为我之前在C中使用邻接矩阵编写了这个程序。现在我尝试编写相同的程序,除了使用C++中的类而不使用邻接矩阵。 我遇到的问题是,我似乎无法正确实现递归函数SearchRoute,因为我需要打印路径、标记路径,然后再次取消路径延迟以允许回溯。当我打印出最终结果时,我只得到了从a到B的一条轨迹,这显然意味着有什么明显的错误 这就是我认为的

我试图打印出从a到L都有车站的地铁系统中所有可能的路径。换句话说,目标是找出一个人可以走多少条可能的路径通过地铁系统,而不必多次越过轨道。我知道有640条可能的路径,因为我之前在C中使用邻接矩阵编写了这个程序。现在我尝试编写相同的程序,除了使用C++中的类而不使用邻接矩阵。 我遇到的问题是,我似乎无法正确实现递归函数SearchRoute,因为我需要打印路径、标记路径,然后再次取消路径延迟以允许回溯。当我打印出最终结果时,我只得到了从a到B的一条轨迹,这显然意味着有什么明显的错误

这就是我认为的问题所在:我知道在SubwaySystem::SearchRoute函数中,我使用了一个if和else语句,这显然不允许调用我的递归函数,但我尝试使用另一个if语句而不是else,但我不太确定条件是什么

void SubwaySystem::SearchRoute(int Current_Station_ID)
{
    while(Current_Station_ID < 33)
    {
        cout << "In while loop\n";
        // \\ Checking progress
        if(Current_Station_ID == 0)  //Find a successful route to Station L
        {
            count_routes++; //Add 1 into the variable “count_routes”
            cout << "In if statement\n";
            // \\Checking progress
            cout << count_routes << " " << my_track[Current_Station_ID] << endl; //Print out this route
            return;
        }
        else //Get into recursive Function Body
        {
            for(int i = my_station[Current_Station_ID].track_starting_ID; i < my_station[Current_Station_ID].track_starting_ID + my_station[Current_Station_ID].track_size; i++)
            {
                if(my_track[Current_Station_ID].visited == 0)  //if this track is not visited before
                {
                    cout << "In recursive part of function\n";
                    // \\ Checking progress
                    my_track[Current_Station_ID].visited = 1; //mark this track as visited
                    my_track[Current_Station_ID].node_2 = 1; //mark its corresponding track as visited
                    cout << my_track[Current_Station_ID] << endl; //save this track
                    SearchRoute(Current_Station_ID + 1); //Recursive
                    i--; //Backtrack this track
                    my_track[Current_Station_ID].visited = 0;//mark this track as unvisited
                    my_track[Current_Station_ID].node_2 = 0;//mark its corresponding track as unvisited
                }
            }
        }
    }
}
void SubwaySystem::SearchRoute(int当前站点ID)
{
同时(当前站点ID<33)
{
你的第一个条件是什么

while(Current_Station_ID < 33)
{
    cout << "In while loop\n";
    // \\ Checking progress
    if(Current_Station_ID == 0)  //Find a successful route to Station L

因此,您永远不会出现在
else
分支中,因为第一个分支始终会被执行,并且它会立即结束(
return

使用递归算法,当您到达最终目的地时,您的if语句应该为true。else语句在您仍在旅途中时。在这种情况下,您已经“到达”了当你访问每一个轨道时。继续你的旅程由else语句负责。for循环找到所有“下一个”站

我将递归调用扩展到:

void SubwaySystem::SearchRoute(int visited_count, int current_station, string route);
如果满足到访次数,则打印路线。否则,选择下一个未到访的站点。 对于每个递归调用,选择下一个要访问的站点,将1添加到当前访问计数,并将当前位置附加到路由字符串


目前,如果您的for循环,my_station只升到11,但当前的_station ID可能是33,那么您也会有一个bug。

您知道调试100行代码有多烦人吗?请缩短它,指出实际的问题对不起。问题存在于SearchRoutes函数中。但是我发布了整个代码,以便它能做出更多的贡献对一起发生的事情有一定的了解。正如他所说,实际问题是递归调用
SearchRoute
。然而,它被嵌入了一个充满长线和模糊条件的例程中。我不打算读它。感谢你帮我修复了这篇文章。user98289有诽谤问题的历史,可能是为了掩盖这一事实这是家庭作业。在我看到的地方可以找到一些讨论。这也是我认为的问题所在。else永远无法执行。我已经尝试了一段时间来更改条件,同时尝试将else全部删除,并用另一个if替换它,以便我可以编写另一个条件。但是,我不确定条件是什么那就好了。所以我有点迷路了。以防万一,我在现代C++11中做了一个类似的路由解决方案(这是来自的“TAN网络”训练练习)。它更复杂,也非常优化(它从文件中读取网络,还知道站点的纬度/经度)如果我去掉while循环。这不会导致for循环中出现无限循环吗?我相信你最终会设置所有访问的节点并退出循环。但我想我误解了要求。我以为你想要从A到L的路径。我现在想你想要使用所有轨迹的路径(一次)。为此,您有两个结束条件:1)使用了所有轨道,2)未使用的轨道不可访问。递归调用是对未使用的、可访问的轨道。关于站点ID错误,我将添加12个站点,0-11或更确切地说是a-k,但my_track数组枚举站点传输。每个站点都有一组可能的传输。站点b,f或者,如果您可以转接到a、c、d、e、f等站点,那么当您在站点b时,您应该使用从所有a、c、d、e中抽取的下一个站点呼叫SearchRoute,并且您尚未访问该站点。
int main(int argc, char **argv)
{
    SubwaySystem Test;
    Test.SearchRoute(0);
}
void SubwaySystem::SearchRoute(int visited_count, int current_station, string route);