В вашем коде несколько проблем:
- В
if (i == 0 && j = 0)
есть синтаксическая ошибка: она должна быть j == 0
, но нет причин возвращаться, когда вы находитесь в верхнем левом углу, это то место, с которого вы начинаете!
- Отсутствует
;
в конце return Mat[i][j]
- В конце
MaximumPath(Mat, i - 1, j + 1)))
- Вы должны передать
i + 1
своим рекурсивным вызовам на MaximumPath
, а не i - 1
.
Вы должны проверить, находится ли j
внутри границ матрицы и вернуть 0
, если нет, и исправить тест if (i = N || j < 0)
как
if (i >= N || j < 0 || J >= N)
Функция max
также неверна: она не возвращает значение, если 2 значения равны и больше, чем третье.
- вам, вероятно, следует попробовать другие начальные точки, такие как (0, 1) и (0, 2). В противном случае, это не соответствует вводимым значениям для этих ячеек, а также для ячейки (1, 2).
Вот исправленная версия:
#include <stdio.h>
#define N 3
int MaximumPath(int Mat[][N], int i, int j);
int main() {
int mat[N][N], i, j;
int max;
printf("Enter the elements of the matrix :\n");
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
if (scanf("%d", &mat[i][j]) != 1)
return 1;
}
}
max = 0;
for (j = 0; j < N; j++) {
max = max3(max, max, MaximumPath(mat, 0, j));
}
printf("%d\n", max);
return 0;
}
int max3(int i, int j, int k) {
if (i >= j && i >= k) {
return i;
} else
if (j >= i && j >= k) {
return j;
} else {
return k;
}
}
int MaximumPath(int Mat[][N], int i, int j) {
// out of matrix boundaries
if (i >= N || j < 0 || j >= N)
return 0;
// compute the maximum path from the current cell
// for all possible directions:
return max3(MaximumPath(Mat, i + 1, j - 1),
MaximumPath(Mat, i + 1, j),
MaximumPath(Mat, i + 1, j + 1)) + Mat[i][j];
}
Обратите внимание, что было бы более эффективно проверить границы перед повторением:
int max(int i, int j) {
if (i >= j)
return i;
else
return j;
}
int MaximumPath(int Mat[][N], int i, int j) {
if (i >= N - 1) {
// reached the last row
return Mat[i][j];
} else {
// try all possible paths
int v = MaximumPath(Mat, i + 1, j)
if (j > 0)
v = max(v, MaximumPath(Mat, i + 1, j - 1));
if (j < N - 1)
v = max(v, MaximumPath(Mat, i + 1, j + 1));
return Max[i][j] + v;
}
}