Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;如何生成随机路径_C++_Algorithm - Fatal编程技术网

C++ C++;如何生成随机路径

C++ C++;如何生成随机路径,c++,algorithm,C++,Algorithm,我正在尝试编写一个函数,可以为给定的2D点数组(x,y)生成一条随机路径 现在,为了使路径有效,我希望它满足一些要求。 路径不能: …是一条从点a到B的直线 …返回自身,但可以返回(如下所示) …平行/沿自身运行 我还想确保路径从左边开始,在右边结束,希望保持简单 因此,我正在寻找一些可以: ......... | ......... | ########. ......... | ......... | .......#. ##....### end | .

我正在尝试编写一个函数,可以为给定的2D点数组(x,y)生成一条随机路径

现在,为了使路径有效,我希望它满足一些要求。 路径不能

  • …是一条从点aB的直线
  • …返回自身,但可以返回(如下所示)
  • …平行/沿自身运行
我还想确保路径从左边开始,在右边结束,希望保持简单

因此,我正在寻找一些可以:

.........     | .........     | ########.
.........     | .........     | .......#.
##....### end | ....####.     | ...#####.
.######..     | #####..#.     | ...#.....
.........     | .......## end | ...###### end
但我不知道从哪里开始,而且几乎没有类似的信息

我可以走A*路,但这似乎有点过头了,根据我对A*的了解(变化不大),我需要制造“假”障碍。在我大喊大叫之前,有人能帮我吗


非常感谢您的任何建议!谢谢。

在找到解决方案之前,您可以一次尝试一个方块:

    • 创建一个数组,例如
      bool points[Num_Rows][Num_Columns]={false},跟踪您去过的地方
    • 初始化
      std::对游标{rand()%Num_行,0},跟踪您所在的位置
      重复
      
      • 计算出光标在不离开棋盘或违反规则的情况下可以向哪个方向移动
      • 如果没有,你就完蛋了:回到上面的“做”
      • 选择一个,通过设置相关的
        点[]
        元素记录您已移动到那里
        • 如果光标位于右侧列中,则完成了从循环中断开

以下描述和代码片段应为您提供足够的信息来解决问题,而无需提供确切的解决方案。注意:以下内容并不满足您的所有标准(例如,防止直线解决方案),但任何缺失的部分都应易于填写


  • 创建网格
  • 生成随机起始单元
  • 生成与起始单元格不同的随机结束单元格
  • 从起始单元格走到结束单元格
  • 将每个职位标记为“已访问”
  • 确定从此位置开始的有效移动
  • 至少1个有效移动:将此位置添加到“解决方案路径”,并将此位置更新为有效移动之一
  • 无有效移动:将此位置更新为最近添加到解决方案路径的位置(即备份),并删除最近添加到解决方案路径的位置 添加到解决方案路径
    • 注意如果“解决方案路径”为空,请在步骤4重新启动
  • 将栅格重置回其原始状态
  • 遍历解决方案路径并将每个单元格标记为“已访问”
  • 打印网格

  • //步骤1
    网格(10,10);
    //步骤2
    Cell start=grid.generateRandomCell();
    //步骤3
    单元结束=开始;
    while(结束==开始)
    {
    end=grid.generateRandomCell();
    }
    向量求解路径;
    //步骤4
    单元位置=开始;
    while(pos!=结束)
    {
    //步骤4.1
    网格设置值(位置“#”);
    //步骤4.2
    std::vector possibleMoves=getPossibleMoves(网格,位置);
    如果(!possibleMoves.empty())
    {
    //步骤4.2.1
    解决方案路径。推回(pos);
    pos=possibleMoves[rand()%possibleMoves.size()];
    }
    其他的
    {
    //步骤4.2.2
    如果(!solutionPath.empty())
    {
    pos=solutionPath.back();
    擦除(--solutionPath.end());
    }
    其他的
    {
    pos=开始;
    grid.reset();
    }
    }
    }
    //步骤5
    grid.reset();
    //步骤6
    对于(size_t i=1;istd::难道你必须使用一种算法来帮助你确定某些顶点是否在特定时间与目标节点隔离。我不太清楚你的意思。你介意详细说明一下吗?你可以找出哪些动作对当前点有效,然后随机选择其中一个动作。您需要递归地执行此操作,以便在当前点没有有效移动的情况下,算法可以“回溯”到上一点。当您到达目的地时,算法就完成了。@user3046336,在您的第2个和第3个示例中,为什么不从
    A
    一直向右,然后一直向下到
    B
    。这将仍然满足您的3个条件,加上“从左到右”的第4个条件。为什么要做额外的循环?请clarify@InnocentBystander,问题表示路径是随机生成的。此解决方案不会每次都有效,如果没有有效的移动,请返回一个移动。那么,如果你陷入这样一种情况,你的动作在棋盘的一侧形成了一个螺旋,会发生什么呢。这意味着你有一个有效的移动到中心,然后你移动。您现在没有有效的移动,因此返回轨道1步。然后再次移动到中心,创建一个无限循环。递归更适合这个问题。只是说。这不会无限循环,访问的单元格不会“未标记”,因此返回一步(即,与从递归函数调用返回的效果相同)允许考虑剩余的移动,如果没有移动,它将继续备份(即,它将永远不会返回到它已经访问过的单元格,除非作为备份的一部分)“递归更适合”,我的解决方案本质上是递归的(使用堆栈是一个强烈的提示).这里是一个关于使用迭代而不是递归解决方案的SO。你知道什么是递归吗?不客气,但你的解决方案有0个递归是的,我知道一个调用自身的函数是递归的。我说我的解决方案本质上是递归的(即,不是按argu
    // Step 1
    Grid grid(10, 10);
    
    // Step 2
    Cell start = grid.generateRandomCell();
    
    // Step 3
    Cell end = start;
    while (end == start)
    {
        end = grid.generateRandomCell();
    }
    
    std::vector<Cell> solutionPath;
    
    // Step 4
    Cell pos = start;
    while (pos != end)
    {
        // Step 4.1
        grid.setValue(pos, '#');
    
        // Step 4.2
        std::vector<Cell> possibleMoves = getPossibleMoves(grid, pos);
        if (!possibleMoves.empty())
        {
            // Step 4.2.1
            solutionPath.push_back(pos);
            pos = possibleMoves[rand() % possibleMoves.size()];
        }
        else
        {
            // Step 4.2.2
            if (!solutionPath.empty())
            {
                pos = solutionPath.back();
                solutionPath.erase(--solutionPath.end());
            }
            else
            {
                pos = start;
                grid.reset();
            }
        }
    }
    
    // Step 5
    grid.reset();
    
    // Step 6
    for (size_t i = 1; i < solutionPath.size(); ++i)
    {
        grid.setValue(solutionPath[i], 'A' + ((i - 1) % 26));
    }
    grid.setValue(start, '@');
    grid.setValue(end, '!');
    
    // Step 7
    std::cout << grid << "\n";