Problem p01389 (C++) — buggy submission, verdict: Runtime Error

#include <cstdio>
#include <stdlib.h>

#define H_MAX 50
#define H_MIN 2
#define W_MAX 50
#define W_MIN 2
#define CICADA_MAX 9
#define CICADA_MIN 0

class CICADA {
public:
  // Public member function
  int Search(void);
  int GetValue(void);

private:
  // Private member variable
  int H = 0, W = 0;              // height, width
  int blk[H_MAX][W_MAX] = {{0}}; // Number of cicadas per block
  int cicada[W_MAX] = {0};       // Total of cicadas
  int cicadabak[W_MAX] = {0};    // Total of cicadas of one block above
};

int CICADA::Search(void) {
  int result = 0;

  for (int i = 0; i < W; i++) {
    for (int j = 0; j < i + 1; j++) {
      cicada[i] += blk[0][j];
    }
  }

  for (int i = 1; i < H; i++) {
    for (int j = 0; j < W; j++) {
      cicadabak[j] = cicada[j];
      if (j == 0) {
        cicada[j] = cicadabak[j] + blk[i][j];
      } else if (cicadabak[j] > cicadabak[j - 1]) {
        cicada[j] = cicadabak[j - 1] + blk[i][j];
      } else {
        cicada[j] = cicadabak[j] + blk[i][j];
      }
      cicadabak[j] = cicada[j];
    }
  }

  result = cicada[W - 1];
  for (int i = 0; i < W; i++) {
    for (int j = i + 1; j < W; j++) {
      cicada[i] += blk[H - 1][j];
    }
    if (cicada[i] < result) {
      result = cicada[i];
    }
  }

  printf("%d\\n", result);

  return 0;
}

int CICADA::GetValue(void) {
  char c;

  scanf("%d %d%*c", &H, &W);

  for (int i = 0; i < H; i++) {
    for (int j = 0; j < W; j++) {
      scanf("%c", &c);
      blk[i][j] = c - '0';

      if ((blk[i][j] > CICADA_MAX) || (blk[i][j] < CICADA_MIN) ||
          (blk[0][0] != 0) || (blk[H - 1][W - 1] != 0)) {
        return -1;
      }
    }
    scanf("%*c");
  }

  return 0;
}

int main(void) {
  CICADA Cicada;

  if (Cicada.GetValue() == -1) {
    return -1;
  }

  Cicada.Search();

  return 0;
}


Error: WA

Fixed submission:

#include <cstdio>
#include <stdlib.h>

#define H_MAX 50
#define H_MIN 2
#define W_MAX 50
#define W_MIN 2
#define CICADA_MAX 9
#define CICADA_MIN 0

class CICADA {
public:
  // Public member function
  int Search(void);
  int GetValue(void);

private:
  // Private member variable
  int H = 0, W = 0;           // height, width
  int blk[H_MAX][W_MAX];      // Number of cicadas per block
  int cicada[W_MAX] = {0};    // Total of cicadas
  int cicadabak[W_MAX] = {0}; // Total of cicadas of one block above
};

int CICADA::Search(void) {
  for (int i = 0; i < W; i++) {
    for (int j = 0; j < i + 1; j++) {
      cicada[i] += blk[0][j];
    }
  }

  for (int i = 1; i < H; i++) {
    for (int j = 0; j < W; j++) {
      cicadabak[j] = cicada[j];
      if (i == 0) {
        cicada[i] = cicadabak[i] + blk[i][j];
      } else if (cicadabak[j] > cicada[j - 1]) {
        cicada[j] = cicada[j - 1] + blk[i][j];
      } else {
        cicada[j] = cicadabak[j] + blk[i][j];
      }
    }
  }

  printf("%d", cicada[W - 1]);

  return 0;
}

int CICADA::GetValue(void) {
  char c;

  scanf("%d %d%*c", &H, &W);

  for (int i = 0; i < H; i++) {
    for (int j = 0; j < W; j++) {
      scanf("%c", &c);
      blk[i][j] = c - '0';

      if ((blk[i][j] > CICADA_MAX) || (blk[i][j] < CICADA_MIN) ||
          (blk[0][0] != 0) || (blk[H - 1][W - 1] != 0)) {
        return -1;
      }
    }
    scanf("%*c");
  }

  return 0;
}

int main(void) {
  CICADA Cicada;

  if (Cicada.GetValue() == -1) {
    return -1;
  }

  Cicada.Search();

  return 0;
}