Ошибка во время выполнения в практических вопросах codechef

#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 . Спасибо за помощь.