#c #recursion #runtime
#c #рекурсия #время выполнения
Вопрос:
Я получаю «sigsegv», ошибку времени выполнения из следующего кода, когда я пытаюсь запустить его на codechef, в то время как код отлично работает на моем компьютере с различными тестовыми вводами.Я также учитывал ограничения, указанные в задаче, но я все еще не могу ее отладить. Вопрос не из какого — либо конкурса , а из практической задачи . Пожалуйста, укажите на любую ошибку, которую вы можете найти. Актуальный вопрос codechef
#include<stdio.h>
int cash[101][101]={0};
int rec[101][2];
int ri=0;
int sumx(int mat[101][101],int i,int j,int lines)
{
int n=0,a=0,b=0;
if(cash[i][j]!=0)
{
return cash[i][j];
}
else if(i==lines-2)
{
n=(mat[i 1][j]>mat[i 1][j 1])?mat[i 1][j]:mat[i 1][j 1];
cash[i][j]=n mat[i][j];
rec[ri][0]=i;
rec[ri ][1]=j;
return n mat[i][j];
}
else
{
a=sumx(mat,i 1,j,lines);
b=sumx(mat,i 1,j 1,lines);
n=(a>b)?a:b;
cash[i][j]=n mat[i][j];
rec[ri][0]=i;
rec[ri ][1]=j;
return n mat[i][j];
}
}
int main()
{
int i=0,k=0;
int lines=0,n=0;
int r=0;
int tc=0;
int mat[101][101];
scanf("%d",amp;tc);
while(tc--)
{
scanf("%d",amp;lines);
i=0;
k=0;
while(i<lines)
{
while(k<=i)
{
scanf("%d",amp;mat[i][k]);
k ;
}
k=0;
i ;
}
if(lines==1)
{
r=mat[0][0];
}
else
{
r=sumx(mat,0,0,lines);
}
i=0;
while(i<ri)
{
cash[(rec[i][0])][(rec[i][1])]=0;
rec[i][0]=0;
rec[i][1]=0;
i ;
}
ri=0;
printf("%dn",r);
}
return 0;
}
Комментарии:
1. можете ли вы объяснить свой подход ?
2. @Randomizer : я сохранил треугольник в матрице 101 * 101, неиспользуемые ячейки игнорируются.матрица передается функции sumx, начиная с индекса 0,0, и она вызывает себя рекурсивно с индексом ниже нее или ниже и справа от нее, в конечном итоге возвращая меньшее из значений по двум индексам плюс значение по текущему индексу . кэш-матрица используется в качестве кэша, так что конкретный посещенный индекс не нужно проходить с коэффициентом усиления . Он записывает значение, которое может генерировать конкретный индекс. rec записывает ячейки использованных денежных средств и сбрасывает их позже. codechef.com/wiki/recursion-sums-triangle
Ответ №1:
Ошибка связана со строками
while(i<ri)
{
cash[(rec[i][0])][(rec[i][1])]=0;
rec[i][0]=0;
rec[i][1]=0;
i ;
}
значения rec[i][0] rec[i][1] могут быть неопределенными в некоторых случаях, т.Е. Они могут возвращать значения мусора
Вместо этого вы можете использовать memset для изменения значений на 0
memset(rec,0,sizeof(rec));
memset(cash,0,sizeof(cash));
Я запустил ваше решение, в реализации вашего алгоритма есть ошибка, попробуйте найти ее самостоятельно
Я могу предоставить вам тестовый пример (с использованием генератора тестовых наборов), для которого он не выполняется
21
79
89 28
14 6 63
96 58 67 48
80 8 22 27 8
24 21 23 96 97 72
38 90 95 83 57 60 94
13 96 9 24 65 27 67 40
26 20 58 42 29 8 52 49 37
80 65 65 34 79 10 89 11 20 84
57 59 72 79 51 67 84 70 43 62 96
16 4 18 9 5 40 34 2 15 4 28 50
29 1 60 39 28 92 38 65 95 57 10 71 37
25 78 96 43 17 51 88 19 0 30 20 80 39 35
55 41 63 76 4 20 97 72 43 93 76 11 82 33 25
61 85 41 77 42 90 20 5 69 51 4 54 41 18 83 72
12 56 21 82 7 1 84 26 47 26 22 52 84 39 75 70 89
12 39 83 92 49 20 35 20 31 96 66 75 48 79 13 51 49 50
42 81 0 58 70 40 16 83 27 34 79 64 14 26 19 22 38 55 93
64 81 26 29 47 22 73 61 3 2 61 99 18 43 33 10 13 46 24 53
5 56 0 0 3 0 71 12 82 34 17 11 14 51 1 82 73 53 85 75 89
правильный ответ — 1431, в то время как ваш код возвращает 1299
Комментарии:
1.
rec
иcash
оба начинаются как обнуленные. Вы предлагаете сделать memset в одном из циклов?
Ответ №2:
@Randomizer : код выполняется нормально с выводом 1431, а не 1299. В любом случае, как вы предположили о мусоре, генерируемом из rec[i] [0] rec [i] [1], мне никогда не казалось, что rec [i] [0] rec [i] [1] может генерировать мусор, поскольку я обращался только к использованным ячейкам. Однако memset устранил необходимость в rec , поэтому кэш был легко сброшен до нуля . Все, что я сделал, это удалил матрицу rec и сбросил кэш с помощью memset, и код на codechef работал нормально. Я не мог понять, как это могло генерировать мусор , тем не менее , это принято на codechef , так как я удалил часть rec . Спасибо за помощь.