Вот версия, которая обнаруживает циклы и отслеживает, пытались ли вы двигаться вперед или назад от определенного квадрата.Пример использования рекурсивной вспомогательной функции с нерекурсивным внешним интерфейсом для установки переменных (здесь векторов fwd
и bck
) для отслеживания того, что вы делаете, очень распространен.
#include <iostream>
#include <vector>
using namespace std;
bool helper(int cur, const vector<int> &squares,
vector<bool> &fwd, vector<bool> &bck)
{
cout << "cur=" << cur << " sq=" << squares[cur] << endl;
if (squares[cur] == 0) return true; // Found.
if (fwd[cur] && bck[cur]) return false; // Cycle.
if (!fwd[cur]) { // Try forwards.
fwd[cur] = true;
int up = cur + squares[cur];
if (up < squares.size()) {
cout << "Forwards" << endl;
bool found = helper(up, squares, fwd, bck);
if (found) return true;
}
}
if (!bck[cur]) { // Try backwards.
bck[cur] = true;
int dn = cur - squares[cur];
if (dn >= 0) {
cout << "Backwards" << endl;
bool found = helper(dn, squares, fwd, bck);
if (found) return true;
}
}
return false;
}
bool solvable(const vector<int> &squares)
{
vector<bool> fwd(squares.size(), false);
vector<bool> bck(squares.size(), false);
return helper(0, squares, fwd, bck);
}
int sqs[] = { 2, 3, 1, 1, 4, 3, 4, 0, 1, 3, 1 };
int main(void)
{
vector<int> sq(sqs, sqs + sizeof(sqs) / sizeof(int));
cout << solvable(sq) << endl;
}