codechef

时间:2015-08-17 12:59:41

标签: c sigsegv

我正在解决问题https://www.codechef.com/problems/DCGAME/ 在此内部,我无法找到导致运行时错误(SIGSEGV)的原因。在我的电脑上,输出很好。我知道这个错误的意思但我仍然无法找到我犯错误的地方。我的代码如下:

  #include <stdio.h>
  void calc(long long int arr1[],int n,long long int arr2[][n],long long int  game[],int m)
  {
 //printf("Pre process %d %d",n,m);
 int i,j;
 for(i=0;i<n;i++){game[arr1[i]]++;}
 for(i=1;i<n;i++)
 {
       for(j=0;j<=n-i-1;j++)
       {
           if(arr2[i-1][j]>arr1[i+j])
           arr2[i][j]=arr2[i-1][j];
           else
           arr2[i][j]=arr1[i+j];
           game[arr2[i][j]]++;
       }
   }
//for(i=0;i<=m;i++){printf(" %d ",game[i]);}
 }
  int main(){

  int n,m,i,count=0,k;
  char c,p;
  scanf("%d %d",&n,&m);
  long long int a[n],b[n][n],max=0;

  for(i=0;i<n;i++)
  {
   scanf("%lld",&a[i]);
   if(a[i]>max)max=a[i];
   b[0][i]=a[i];
  }
   long long int game[max+1];
   for(i=0;i<=max;i++)
   game[i]=0;
   calc(a,n,b,game,max);
   while(m--)
  {
   // printf("WHILE-M");
   c=getchar();

   //scanf("%c",&c);
    scanf("%c %d %c",&c,&k,&p);

        switch(c)
        {//printf("SWITCH");
            case '<':
            //printf("CASE <");
            if(k>max){if(p=='D')
                {
                    printf("C");count=0;
                }
                else
                {
                    printf("D");count=0;
                }break;}
            for(i=1;i<k;i++)
            {if(game[i]>0)
            count+=game[i];
            }
            if(count%2==0)
            {
                if(p=='D')
                {
                    printf("C");count=0;
                }
                else
                {
                    printf("D");count=0;
                }
            }
            else
            {
                if(p=='D')
                {
                    printf("D");count=0;
                }
                else
                {
                    printf("C");count=0;
                }
            }
            break;
            case '>':
            //printf("CASE >");
            if(k>max){if(p=='D')
                {
                    printf("C");count=0;
                }
                else
                {
                    printf("D");count=0;
                }break;}
            for(i=k+1;i<=max;i++)
            {if(game[i]>0)
            count+=game[i];
            }
            if(count%2==0)
            {
                if(p=='D')
                {
                    printf("C");count=0;
                }
                else
                {
                    printf("D");count=0;
                }
            }
            else
            {
                if(p=='D')
                {
                    printf("D");count=0;
                }
                else
                {
                    printf("C");count=0;
                }
            }
            break;

            case '=':
            //printf("CASE =");
            if(k>max){if(p=='D')
                {
                    printf("C");count=0;
                }
                else
                {
                    printf("D");count=0;
                }break;}
            count+=game[k];
            if(count%2==0)
            {
                if(p=='D')
                {
                    printf("C");count=0;
                }
                else
                {
                    printf("D");count=0;
                }
            }
            else
            {
                if(p=='D')
                {
                    printf("D");count=0;
                }
                else
                {
                    printf("C");count=0;
                }
            }
            break;
        }


      }
      return 0;

     }

1 个答案:

答案 0 :(得分:2)

如果你的算法是正确的(我没有检查),但你的堆栈空间不足,那么一个简短的修复是将long long int a[n],b[n][n],max=0;更改为:

long long int *a, (*b)[n], max = 0;
a = malloc(n * sizeof *a);
b = malloc(n * sizeof *b);

并将long long int game[max+1]; for(i=0;i<=max;i++) game[i]=0;更改为:

long long int *game = calloc(max+1, sizeof *game);

你也应该检查是否有失败,例如if ( !a || !b ) exit(EXIT_FAILURE);。其余代码可以保持不变。