왼쪽 상단 모서리부터 시작하여 아래쪽 오른쪽 구석까지 덜 무거운 경로를 찾고 싶습니다. 오른쪽, 아래 또는 오른쪽으로 만 움직일 수 있다는 조건이 있습니다. 역 추적 알고리즘이 멈춤.
이
은 예입니다 matrix example내가 되돌아와 문제를 해결하기 위해 필요하지만, 내가 잘하고있어 경우 내가 말할 수 없습니다.
이 코드는 최대 10x10 크기의 행렬을 해결할 수 있지만 20x20 행렬을 사용하면 막히게됩니다 (적어도 시간이 지나면 생각하는 것입니다).
/*
* i, j -> matrix iterators.
* n, m -> matrix height and width
* map -> matrix
* actualPath, bestPath -> vectors for representing the path later
* actual -> actual path weight
* best -> best path weight
*/
int backtracking(int i, int j, const int &n, const int &m,
const vector<vector<int>> &map,
vector<vector<int>> &actualPath,
vector<vector<int>> &bestPath,
int best) {
recursiveCalls++;
int actual = 0;
//Bottom-right corner
if(i == (n-1) && j == (m-1)) {
return map[i][j];
}
//Last row, only right
else if(i == (n-1)) {
actual = map[i][j] +
backtracking(i, (j+1), n, m, map, actualPath, bestPath, best, profundidad);
}
//Last column, only down
else if(j == (m-1)) {
actual = map[i][j] +
backtracking((i+1), j, n, m, map, actualPath, bestPath, best, profundidad);
}
else {
int downRight = backtracking((i+1), (j+1), n, m, map, actualPath, bestPath, best, profundidad);
int right = backtracking(i, (j+1), n, m, map, actualPath, bestPath, best, profundidad);
int down = backtracking((i+1), j, n, m, map, actualPath, bestPath, best, profundidad);
actual = map[i][j] + minimo(downRight, right, down);
}
if(actual < best) {
best = actual;
bestPath = actualPath;
}
return best;
}
경계를 사용하지 않기 때문에 멈출 수 있습니까? 아니면 나쁜 구현입니까? 내가 뭘 잘못하고 있는지 모르겠다. 나는이 알고리즘을 이해한다고 생각하지만,이 문제에 대해 어떻게 구현해야할지 모르겠다. ...
디버거로 코드를 실행 해 보셨습니까? –
'백 트랙킹을 사용하여 해결해야한다'는 말은 백 트랙킹이 최선의 해결책은 아니지만 백 트랙킹을 사용하여 해결하려고 시도한다는 것을 알고 있더라도 의미가 있습니까? –
재귀/반복 솔루션을 실험 할 때 항상 최대 재귀/반복 횟수에 휴식 조건을 넣어서 영원히 기다리는 대신 중간 솔루션을 검사 할 수있는 기회를 갖게됩니다. – user463035818