2016-01-12 3 views
0

Я работаю над проблемой в онлайн-судье (ссылка here), и каждый раз, когда я отправляю свое решение, я получаю вердикт ошибки во время выполнения. Я смотрел на него какое-то время, я все еще не могу понять, что с ним не так. Я также рассмотрел типичные причины ошибки времени выполнения (массивы из связей, предел памяти превышен, логические ошибки ... ect). Я не могу найти ни одного из них в приведенном ниже кодексе:C: Runtime Error Verdict (Help debugging)

#include<stdio.h> 

int Hall[110][110]; 

int isValid(int x, int y){ 
int i,j,cnt=0; 

for(i=x-1; i<=x+1; i++) 
    for(j=y-1; j<=y+1; j++) 
      if(Hall[x][y]==Hall[i][j]) 
       cnt++; 
if(cnt>1) 
    return 0; 
else 
    return 1; 
} 

int notChecked(int N,int* checked,int size){ 
    int i; 

    for(i=0; i<size; i++) 
    if(checked[i] == N) 
     return 0; 

    return 1; 
} 

int main (void){ 
    int T,R,C,checked[110],i,j,k,size; 

    scanf("%d",&T); 
    for(i=0; i<T; i++){ 
    scanf("%d %d",&R,&C); 
    //initialize 
    size=0; 
    for(j=0; j<R*C; j++) checked[j] = -1; 
    for(j=0; j<=C+1; j++){ 
      Hall[0][j] = -1; 
      Hall[R+1][j] = -1; 
    } 
    for(j=0; j<=R+1; j++){ 
      Hall[j][0] = -1; 
      Hall[j][C+1] = -1; 
    } 
    //read input 
    for(j=1; j<=R; j++) 
     for(k=1; k<=C; k++) 
      scanf("%d",&Hall[j][k]); 

    //algo: 
    for(j=1; j<=R; j++) 
     for(k=1; k<=C; k++) 
      if(Hall[j][k]>=0){ 
       if(notChecked(Hall[j][k],checked,size)){ 
        if(isValid(j,k)==0){ 
         checked[size] = Hall[j][k]; 
         size++; 
        } 
       } 
      } 

    printf("%d\n",size); 
} 

return 0;} 

Любая помощь очень ценится!

+0

Что произойдет, если вы запустите его самостоятельно и с каким вводом? – dbush

+0

@dbush Он работает довольно хорошо. Я попробовал ввод, предложенный на странице проблемы, и сам придумал угловые тестовые примеры, такие как сетка с одной ячейкой (вывод должен быть 0), все ячейки сетки содержат -1 (вывод 0) ... Не пробовали максимальный размер ввода. – Njw96

+0

'int checked [110] ... для (j = 0; j 'checked [j]' вне границ? – chux

ответ

0

Вам необходимо сделать проверку границ на вашем входе.

Согласно сайту T должно быть от 1 до 100 включительно, поэтому вам нужно это проверить. Затем для каждого R и C (N и M на сайте) они также должны быть от 1 до 100 включительно.

Для каждого набора R по C записи, вы должны убедиться, что вы на самом деле читать в R строк и столбцов C. Вам также необходимо убедиться, что вы читаете в T общих наборах записей.

+0

Если спецификация проблемы содержит диапазон ввода, я думаю, что он предназначен как гарантия, а не то, что вам необходимо проверить. – Barmar

+0

@Barmar точно ... – Njw96

0

Проблема решена!

Код содержал массив из проблемы облигаций, в следующей строке:

for(j=0; j<R*C; j++) checked[j] = -1; 

Зная, что проверено имели размер 110 и R и C макс размер 100 каждого. Я изменил размер проверенного на 10100, и он сработал.

Спасибо @chux за помощь!