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

#include <cstring>
#include <iostream>
using namespace std;

bool change(string *s, int x, int y) {
  //  std::cout << x << " " << y << std::endl;
  if (s[y][x] != s[y][x + 1]) {
    char tmp = s[y][x];
    s[y][x] = s[y][x + 1];
    s[y][x + 1] = tmp;
    return true;
  }
  return false;
}

void drop(string *s, int w, int h) {
  for (int i = 0; i < h; i++) {
    for (int j = 0; j < w; j++) {
      for (int k = h - 1; k > i; k--) {
        if (s[k][j] == '.') {
          char tmp = s[k][j];
          s[k][j] = s[k - 1][j];
          s[k - 1][j] = tmp;
        }
      }
    }
  }
}
bool erace(string *s, int w, int h, int n) {
  int count;
  int mark[h][w];
  memset(mark, 0, sizeof(mark));
  char prev;
  bool res = false;
  for (int i = 0; i < h; i++) {
    count = 1;
    prev = s[i][0];
    for (int j = 1; j <= w; j++) {
      if (j < w && prev == s[i][j] && prev != '.') {
        count++;
      } else {
        if (count >= n) {
          for (int k = 1; k <= count; k++)
            mark[i][j - k] = 1;
        }
        count = 1;
        if (j < w)
          prev = s[i][j];
      }
    }
  }
  for (int i = 0; i < w; i++) {
    count = 1;
    prev = s[0][i];
    for (int j = 1; j <= h; j++) {
      if (j < h && prev == s[j][i] && prev != '.') {
        count++;
      } else {
        if (count >= n) {
          for (int k = 1; k <= count; k++)
            mark[j - k][i] = 1;
        }
        count = 1;
        if (j < h)
          prev = s[j][i];
      }
    }
  }
  for (int i = 0; i < h; i++) {
    for (int j = 0; j < w; j++) {
      if (mark[i][j] == 1) {
        res = true;
        s[i][j] = '.';
      }
    }
  }
  return res;
}

int main() {
  int n, h, w;
  cin >> h >> w >> n;
  string s[40];
  for (int i = 0; i < h; i++) {
    cin >> s[i];
  }
  string tmp[40];
  for (int i = 0; i < h; i++) {
    for (int j = 0; j < w - 1; j++) {
      for (int k = 0; k < h; k++) {
        tmp[k] = s[k];
      }
      if (change(tmp, j, i)) {
        drop(tmp, w, h);
        while (erace(tmp, w, h, n)) {
          drop(tmp, w, h);
        }
        // std::cout << "after drop" << std::endl;
        // for (int i = 0; i < h; i++) {
        //   std::cout << tmp[i] << std::endl;
        // }
        // std::cout << std::endl;
        int flag = 1;
        for (int y = 0; y < h; y++) {
          for (int x = 0; x < w; x++) {
            if (tmp[y][x] != '.') {
              flag = 0;
            }
          }
        }
        if (flag) {
          std::cout << "YES" << std::endl;
          return 0;
        }
      }
    }
  }
  std::cout << "NO" << std::endl;
  return 0;
}

Error: 0

Fixed submission:

#include <cstring>
#include <iostream>
using namespace std;

bool change(string *s, int x, int y) {
  // std::cout << x << " " << y << std::endl;
  if (s[y][x] != s[y][x + 1] && s[y][x] != '.' && s[y][x + 1] != '.') {
    char tmp = s[y][x];
    s[y][x] = s[y][x + 1];
    s[y][x + 1] = tmp;
    return true;
  }
  return false;
}

void drop(string *s, int w, int h) {
  for (int i = 0; i < h; i++) {
    for (int j = 0; j < w; j++) {
      for (int k = h - 1; k > i; k--) {
        if (s[k][j] == '.') {
          char tmp = s[k][j];
          s[k][j] = s[k - 1][j];
          s[k - 1][j] = tmp;
        }
      }
    }
  }
}
bool erace(string *s, int w, int h, int n) {
  int count;
  int mark[h][w];
  memset(mark, 0, sizeof(mark));
  char prev;
  bool res = false;
  for (int i = 0; i < h; i++) {
    count = 1;
    prev = s[i][0];
    for (int j = 1; j <= w; j++) {
      if (j < w && prev == s[i][j] && prev != '.') {
        count++;
      } else {
        if (count >= n) {
          for (int k = 1; k <= count; k++) {
            mark[i][j - k] = 1;
          }
        }
        count = 1;
        if (j < w)
          prev = s[i][j];
      }
    }
  }
  for (int i = 0; i < w; i++) {
    count = 1;
    prev = s[0][i];
    for (int j = 1; j <= h; j++) {
      if (j < h && prev == s[j][i] && prev != '.') {
        count++;
      } else {
        if (count >= n) {
          for (int k = 1; k <= count; k++) {
            mark[j - k][i] = 1;
          }
        }
        count = 1;
        if (j < h)
          prev = s[j][i];
      }
    }
  }
  for (int i = 0; i < h; i++) {
    for (int j = 0; j < w; j++) {
      if (mark[i][j] == 1) {
        res = true;
        s[i][j] = '.';
      }
    }
  }
  return res;
}

int main() {
  int n, h, w;
  cin >> h >> w >> n;
  string s[40];
  for (int i = 0; i < h; i++) {
    cin >> s[i];
  }
  string tmp[40];
  for (int i = 0; i < h; i++) {
    for (int j = 0; j < w - 1; j++) {
      for (int k = 0; k < h; k++) {
        tmp[k] = s[k];
      }
      if (change(tmp, i, j)) {
        while (erace(tmp, w, h, n)) {
          drop(tmp, w, h);
        }
        // std::cout << "after drop" << std::endl;
        // for (int i = 0; i < h; i++) {
        //   std::cout << tmp[i] << std::endl;
        // }
        // std::cout << std::endl;
        int flag = 1;
        for (int y = 0; y < h; y++) {
          for (int x = 0; x < w; x++) {
            if (tmp[y][x] != '.') {
              flag = 0;
            }
          }
        }
        if (flag) {
          std::cout << "YES" << std::endl;
          return 0;
        }
      }
    }
  }
  std::cout << "NO" << std::endl;
  return 0;
}