2014-11-28 4 views
-2

Я пытаюсь решить вопрос о codechef: http://www.codechef.com/problems/SUMTRIAN постановка задачи:Почему я получаю ошибку выполнения во время выполнения этого кода?

Let's consider a triangle of numbers in which a number appears in the first line, two numbers appear in the second line, three in the third line, etc. Develop a program which will compute the largest of the sums of numbers that appear on the paths starting from the top towards the base, so that: 
on each path the next number is located on the row below, more precisely either directly below or below and one place to the right; 
the number of rows is strictly positive, but less than 100 
all numbers are positive integers between O and 99. 
Input: 
2 
3 
1 
2 1 
1 2 3 
4 
1 
1 2 
4 1 2 
2 3 1 1 

Output: 
5 
9 

это код, который я представил:

#include<stdio.h> 

int maximum(int** s,int row,int col) 
{ 
    int i,j,m[row][col]; 
    //m[0][0]=s[0][0]; 
    for (i = 0; i <row; ++i) 
    { 
     for (j = 0; j < row; ++j) 
     { 
      m[i][j]=0; 
     } 
    } 
    for(i=0;i<row;i++) 
    { 
     for(j=0;j<=i;j++) 
     { 

      if(i==0&&j==0) 
       m[i][j]=s[i][j]; 
      else if(j==0) 
       m[i][j]=m[i-1][j]+s[i][j]; 
      else if(i==0) 
       m[i][j]=s[i][j]; 
      else if(m[i-1][j]>m[i-1][j-1]) 
       m[i][j]=m[i-1][j]+s[i][j]; 
      else 
       m[i][j]=m[i-1][j-1]+s[i][j]; 
      //printf("m%d %d %d\n",m[i][j],i,j); 

     } 
    } 
    for (i = 0; i <row; ++i) 
    { 
     for (j = 0; j < row; ++j) 
     { 
      //printf("%d\n",m[i][j]); 
     } 
    } 
    int max=0; 
    for (i = 0; i <row; ++i) 
    { //printf("%d\n",m[row-1][i]); 
     if(m[row-1][i]>max) 
      max=m[row-1][i]; 
    } 
    return max; 
} 


    int main() 
    { 
     int t; 
     scanf("%d",&t); 
     while(t--) 
     { 
      int n,i,j,*p[10],**pf; 

      scanf("%d",&n); 
      int s[n][n]; 
      for(i=0;i<n;i++) 
      { 
       for(j=0;j<=i;j++) 
       { 
        s[i][j]=0; 

       } 
      } 
      for(i=0;i<n;i++) 
      { 
       for(j=0;j<=i;j++) 
       { 
        scanf("%d",&s[i][j]); 

       } 
       p[i]=s[i]; 


      } 
      pf=p; 

      int sum=maximum((int**)pf,n,n); 
      printf("%d\n",sum); 


     } 



     return 0; 
    } 

этот код дает SIGSEGV.I не знаю, почему «Я не занимаю много памяти.stack не привыкает много. Я инициализирую каждый элемент. Единственная проблема, которая может быть связана с индексом массива за пределами границ, но я не думаю, что это происходит где-то. Помогите!

+0

Пожалуйста, включите образец ввода и ожидаемый выход. – SSC

+0

Используйте 'm [row] [col] = {0};' для инициализации массива с '0'. – Himanshu

+0

ничего не изменит! Я имею в виду, что это не исправит. – user3870509

ответ

0
for (j = 0; j < row; ++j) 
    { 
     m[i][j]=0; 
    } 

Я думаю row здесь должен быть col.

+1

его квадратная матрица поэтому не имеет значения. – user3870509

+3

Итак, почему у вас есть параметр 'col'? Вы должны удалить его из прототипа функции. – ouah

+0

@ user3870509 Теоретически это не имеет значения, но в любом случае. стандарт C говорит, что расширение границ массива приводит к неопределенному поведению. Средство даже в 2D-массиве, объявленное как 'arr [5] [5]' Это будет доступ за пределами границ, если вы сделаете 'arr [1] [7] ....' Большинство окружений поддерживают это в любом случае, но просто отмечают, дело не совсем правильно. Или вы имеете в виду, что строка всегда равна col? Тогда я прошу себя, так же, как и уаа. – dhein

Смежные вопросы