Первый пост здесь, так что прости меня, если я что-то делаю неправильно.Я не могу понять, как рекурсивно найти и распечатать все кратчайшие пути из точки A в точку B.
Я делаю программу, в которой робот переходит из точки A в точку B, используя кратчайший возможный путь.Программа должна использовать рекурсию, находить и распечатывать все кратчайшие пути, которые робот может пройти из точки А, чтобы добраться до точки Б. Например, если робот стартует в точке (1, 2) и ему необходимо пройти путь до точки(3, 5), тогда программа должна напечатать 10 путей всего за 5 ходов (например, NNNEE).Вот две наиболее важные функции, извините, что код такой грязный.
void Robot::FindPath(const Board &board)
{
string path = "";
vector < string > pathsVector;
MoveRobot(startingX,
startingY,
treasureX,
treasureY,
path,
"",
0,
pathsVector);
}
void Robot::MoveRobot(const int &startingX,
const int &startingY,
const int &treasureX,
const int &treasureY,
const string &path,
const string &lastMove,
const int &numMovesDirection,
vector<string> &pathVector)
{
if (startingX == treasureX && startingY == treasureY)
{
cout << path << endl;
PathCount++;
pathVector.push_back(path);
return;
}
else if (startingY == treasureY)
{
if (startingX - treasureX > 0)
{
if (lastMove == "W" && numMovesDirection == MaxStepsDir)
{
}
else if (lastMove == "W" &&
(numMovesDirection < MaxStepsDir ||
numMovesDirection > MaxStepsDir))
{
MoveRobot(startingX - 1,
startingY,
treasureX,
treasureY,
path + "W",
"W",
numMovesDirection + 1,
pathVector);
}
else if (lastMove != "W")
{
MoveRobot(startingX - 1,
startingY,
treasureX,
treasureY,
path + "W",
"W",
1,
pathVector);
}
}
else if (startingX - treasureX < 0)
{
if (lastMove == "E" && numMovesDirection == MaxStepsDir)
{
}
else if (lastMove == "E" &&
(numMovesDirection < MaxStepsDir ||
numMovesDirection > MaxStepsDir))
{
MoveRobot(startingX + 1,
startingY,
treasureX,
treasureY,
path + "E",
"E",
numMovesDirection + 1,
pathVector);
}
else if (lastMove != "E")
{
MoveRobot(startingX + 1,
startingY,
treasureX,
treasureY,
path + "E",
"E",
1,
pathVector);
}
}
}
else if (startingX == treasureX)
{
if (startingY - treasureY > 0)
{
if (lastMove == "S" && numMovesDirection == MaxStepsDir)
{
}
else if (lastMove == "S" &&
(numMovesDirection < MaxStepsDir ||
numMovesDirection > MaxStepsDir))
{
MoveRobot(startingX,
startingY - 1,
treasureX,
treasureY,
path + "S",
"S",
numMovesDirection + 1,
pathVector);
}
else if (lastMove != "S")
{
MoveRobot(startingX,
startingY - 1,
treasureX,
treasureY,
path + "S",
"S",
1,
pathVector);
}
}
else if (startingY + treasureY > 0)
{
if (lastMove == "N" && numMovesDirection == MaxStepsDir)
{
}
else if (lastMove == "N" &&
(numMovesDirection < MaxStepsDir ||
numMovesDirection > MaxStepsDir))
{
MoveRobot(startingX,
startingY + 1,
treasureX,
treasureY,
path + "N",
"N",
numMovesDirection + 1,
pathVector);
}
else if (lastMove != "N")
{
MoveRobot(startingX,
startingY + 1,
treasureX,
treasureY,
path + "N",
"N",
1,
pathVector);
}
}
}
else
{
if (startingX - treasureX > 0)
{
if (lastMove == "W" && numMovesDirection == MaxStepsDir)
{
}
else if (lastMove == "W" &&
(numMovesDirection < MaxStepsDir ||
numMovesDirection > MaxStepsDir))
{
MoveRobot(startingX - 1,
startingY,
treasureX,
treasureY,
path + "W",
"W",
numMovesDirection + 1,
pathVector);
}
else if (lastMove != "W")
{
MoveRobot(startingX - 1,
startingY,
treasureX,
treasureY,
path + "W",
"W",
1,
pathVector);
}
}
else if (startingX - treasureX < 0)
{
if (lastMove == "E" && numMovesDirection == MaxStepsDir)
{
}
else if (lastMove == "E" &&
(numMovesDirection < MaxStepsDir ||
numMovesDirection > MaxStepsDir))
{
MoveRobot(startingX + 1,
startingY,
treasureX,
treasureY,
path + "E",
"E",
numMovesDirection + 1,
pathVector);
}
else if (lastMove != "E")
{
MoveRobot(startingX + 1,
startingY,
treasureX,
treasureY,
path + "E",
"E",
1,
pathVector);
}
}
else if (startingY - treasureY > 0)
{
if (lastMove == "S" && numMovesDirection == MaxStepsDir)
{
}
else if (lastMove == "S" &&
(numMovesDirection < MaxStepsDir ||
numMovesDirection > MaxStepsDir))
{
MoveRobot(startingX,
startingY - 1,
treasureX,
treasureY,
path + "S",
"S",
numMovesDirection + 1,
pathVector);
}
else if (lastMove != "S")
{
MoveRobot(startingX,
startingY - 1,
treasureX,
treasureY,
path + "S",
"S",
1,
pathVector);
}
}
else if (startingY + treasureY > 0)
{
if (lastMove == "N" && numMovesDirection == MaxStepsDir)
{
}
else if (lastMove == "N" &&
(numMovesDirection < MaxStepsDir ||
numMovesDirection > MaxStepsDir))
{
MoveRobot(startingX,
startingY + 1,
treasureX,
treasureY,
path + "N",
"N",
numMovesDirection + 1,
pathVector);
}
else if (lastMove != "N")
{
MoveRobot(startingX,
startingY + 1,
treasureX,
treasureY,
path + "N",
"N",
1,
pathVector);
}
}
}
}
Я знаю, что «возврат» в первом операторе if останавливает рекурсию, но я не знаю, где ещеЯ бы закончил рекурсию, когда все 10 кратчайших путей в приведенном мной примере найдены и напечатаны.Как это только печатает EENNN.Пожалуйста, игнорируйте операторы if, которые говорят: «if (lastMove ==« W »&& numMovesDirection == MaxStepsDir)», я планирую заполнить их позже, чтобы заставить работать другую часть программы.Любая помощь в этом очень ценится!