C ++如何生成随机路径

时间:2015-01-30 02:28:41

标签: c++ algorithm

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

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

  • ...从 A B 的直线。
  • ...重新开始,但可以倒退(<​​em>在下面演示)。
  • ...并行/沿着自己跑。

我还想确保路径从左侧开始,到右侧结束,希望保持简单。

所以我正在寻找可以做的事情:

.........     | .........     | ########.
.........     | .........     | .......#.
##....### end | ....####.     | ...#####.
.######..     | #####..#.     | ...#.....
.........     | .......## end | ...###### end

但是,我不知道从哪里开始,并且可以获得与此类似的信息。

我可以去A *溃败,但这看起来有点过分,而且从我对A *的了解(变化很小)我需要创建&#34;假的&#34;障碍。无论如何,在我咆哮之前,有人可以帮助我吗?

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

2 个答案:

答案 0 :(得分:1)

您可以一次尝试一个方格,直到找到解决方案:

    • 创建一个数组,例如bool points[Num_Rows][Num_Columns] = { false };,跟踪你去过的地方
    • 初始化std::pair<int,int> cursor { rand() % Num_Rows, 0 };,跟踪您的位置 重复
      • 确定光标可以在不离开电路板或违反规则的情况下移动的方向
      • 如果没有,你就破产了:回到上面的“做”
      • 选择一个,通过设置相关的points[]元素记录您已移动到那里
        • 如果您的光标位于右侧列中,您已完成,中断来自循环

答案 1 :(得分:1)

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


  1. 创建网格
  2. 生成随机起始单元
  3. 生成与起始单元格不同的随机结束单元格
  4. 从起始单元格走到结束单元格
    1. 将每个职位标记为“已访问”
    2. 确定此位置的有效移动
      1. 至少1次有效移动:将此位置位置添加到“解决方案路径”中。并将此位置更新为有效行动之一
      2. 无有效移动:将此位置更新为最近添加到解决方案路径(即备份)的位置,并删除最近的位置 添加到解决方案路径中
        • 请注意&#39;解决方案路径&#39;在第4步再次重新启动
  5. 将网格重置为原始状态
  6. 遍历解决方案路径并将每个单元格标记为“已访问”
  7. 打印网格

  8. // 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";