C++ C++;如何生成随机路径
我正在尝试编写一个函数,可以为给定的2D点数组(x,y)生成一条随机路径 现在,为了使路径有效,我希望它满足一些要求。 路径不能:C++ C++;如何生成随机路径,c++,algorithm,C++,Algorithm,我正在尝试编写一个函数,可以为给定的2D点数组(x,y)生成一条随机路径 现在,为了使路径有效,我希望它满足一些要求。 路径不能: …是一条从点a到B的直线 …返回自身,但可以返回(如下所示) …平行/沿自身运行 我还想确保路径从左边开始,在右边结束,希望保持简单 因此,我正在寻找一些可以: ......... | ......... | ########. ......... | ......... | .......#. ##....### end | .
- …是一条从点a到B的直线
- …返回自身,但可以返回(如下所示)
- …平行/沿自身运行
......... | ......... | ########.
......... | ......... | .......#.
##....### end | ....####. | ...#####.
.######.. | #####..#. | ...#.....
......... | .......## end | ...###### end
但我不知道从哪里开始,而且几乎没有类似的信息
我可以走A*路,但这似乎有点过头了,根据我对A*的了解(变化不大),我需要制造“假”障碍。在我大喊大叫之前,有人能帮我吗
非常感谢您的任何建议!谢谢。在找到解决方案之前,您可以一次尝试一个方块:
- 做
- 创建一个数组,例如
bool points[Num_Rows][Num_Columns]={false}代码>,跟踪您去过的地方
- 初始化
std::对游标{rand()%Num_行,0}代码>,跟踪您所在的位置 重复
- 计算出光标在不离开棋盘或违反规则的情况下可以向哪个方向移动
- 如果没有,你就完蛋了:回到上面的“做”
- 选择一个,通过设置相关的
元素记录您已移动到那里点[]
- 如果光标位于右侧列中,则完成了从循环中断开
- 创建一个数组,例如
- 注意如果“解决方案路径”为空,请在步骤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;i std::难道你必须使用一种算法来帮助你确定某些顶点是否在特定时间与目标节点隔离。我不太清楚你的意思。你介意详细说明一下吗?你可以找出哪些动作对当前点有效,然后随机选择其中一个动作。您需要递归地执行此操作,以便在当前点没有有效移动的情况下,算法可以“回溯”到上一点。当您到达目的地时,算法就完成了。@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";