2015-12-29 63 views
-2

我收到了關於問題10189上的UVa判斷的運行時錯誤。我嘗試過很難,但我一直無法找到錯誤的原因。 在這個問題上,我們應該找到一個掃雷艦field.Here提示矩陣是我的代碼:UVa判斷運行時錯誤

#include <stdio.h> 

int main() { 
    char ch; 
    int row, col, i, j, ans[101][101]; 
    int tot = 0; 

    scanf("%d %d", &row, &col); 

    while (row != 0) { 
     tot++; 

     for (i = 1; i <= row; i++) { 
      scanf("\n"); 
      for (j = 1; j <= col; j++) { 
       ch = getchar(); 
       if (ch == '*') { 
        ans[i][j] = 1; 
       } else { 
        ans[i][j] = 0; 
       } 
      } 
     }   
     for (i = 0; i <= row + 1; i++) { 
      ans[i][0] = 0; 
      ans[i][col+1] = 0; 
     } 
     for (j = 0; j <= col + 1; j++) { 
      ans[0][j] = 0; 
      ans[row+1][j] = 0; 
     } 

     printf("Field #%d\n", tot); 
     for (i = 1; i <= row; i++) { 
      for (j = 1; j <= col; j++) { 
       if (ans[i][j] == 1) 
        printf("*"); 
       else { 
        printf("%d", ans[i-1][j-1] + ans[i-1][j] + ans[i-1][j+1] + 
           ans[i][j-1] +    ans[i][j+1] + 
           ans[i+1][j-1] + ans[i+1][j] + ans[i+1][j+1]); 
       } 
      } 
      printf("\n"); 
     } 
     printf("\n"); 

     scanf("\n%d %d", &row, &col); 
    } 
    return 0; 
} 
+0

@EugeneSh。不,我很抱歉。我錯誤地點擊了帖子按鈕。 – arl

+1

你正在越過數組邊界。 –

回答

0

如果雷區可能100x100,你應該做的陣列一列更大,一排更長: ans[102][102]

需要注意的是,你可以通過初始化數組0閱讀雷區之前簡化代碼:

memset(ans, 0, sizeof ans); 

你一定要還檢查scanf返回值檢測無效的輸入和/或過早的EOF,並避免未定義的行爲和無限循環。