Problem p01349 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <bits/stdc++.h>
using namespace std;
int h, w, n;

void drop(vector<string> &cp) {
  for (int j = 0; j < w; j++) {
    int empcnt = 0;
    for (int i = h - 1; i >= 0; i--) {
      if (cp[i][j] == '.')
        empcnt++;
      else if (empcnt > 0) {
        cp[i + empcnt][j] = cp[i][j];
        cp[i][j] = '.';
      }
    }
  }
  return;
}

bool clear(vector<string> &cp) {
  bool cleared = false;
  vector<vector<int>> cl(h, vector<int>(w, 0));
  for (int i = 0; i < h; i++) {
    int prec = '&' - 'A';
    int cnt = 0;
    for (int j = 0; j < w; j++) {
      if (prec == (cp[i][j] - 'A')) {
        cnt++;
      } else {
        if (cnt >= n) {
          for (int k = j - cnt; k < j; k++) {
            cl[i][k] = true;
          }
        }
        if (isalpha(cp[i][j])) {
          prec = (cp[i][j] - 'A');
          cnt = 1;
        } else {
          cnt = -10000;
          prec = '&' - 'A';
        }
      }
    }
    if (prec != '&' - 'A' && cnt >= n) {
      for (int k = w - cnt; k < w; k++) {

        cl[i][k] = true;
      }
    }
  }

  for (int j = 0; j < w; j++) {
    int prec = '&' - 'A';
    int cnt = -10000;
    for (int i = 0; i < h; i++) {
      if (prec == (cp[i][j] - 'A')) {

        cnt++;
      } else {
        if (cnt >= n) {
          for (int k = i - cnt; k < i; k++) {
            cl[k][j] = true;
          }
        }
        if (isalpha(cp[i][j])) {
          cnt = 1;
          prec = (cp[i][j] - 'A');
        } else {
          cnt = -10000;
          prec = '&' - 'A';
        }
      }
    }
    if (prec != '&' - 'A' && cnt >= n) {
      for (int k = h - cnt; k < h; k++) {
        cl[k][j] = true;
      }
    }
  }

  for (int i = 0; i < h; i++) {
    for (int j = 0; j < w; j++) {
      if (cl[i][j]) {
        cp[i][j] = '.';
        cleared = true;
      }
    }
  }
  return cleared;
}

bool check(vector<string> &cp) {
  bool no_block = true;
  for (int i = 0; i < h; i++) {
    for (int j = 0; j < w; j++) {
      no_block = (no_block && cp[i][j] == '.');
    }
  }
  if (no_block)
    return true;
  drop(cp);
  if (!clear(cp))
    return false;
  return check(cp);
}

int main() {
  cin >> h >> w >> n;
  vector<string> b(h);
  for (int i = 0; i < h; i++)
    cin >> b[i];
  bool res = false;
  for (int i = 0; i < h; i++) {
    for (int j = 0; j < w - 1; j++) {
      vector<string> cp = b;
      swap(cp[i][j], cp[i][j + 1]);
      res = res || check(cp);
      if (res) {
        j = w;
        i = h;
      }
    }
  }
  cout << (res ? "YES" : "NO") << endl;

  return 0;
}

Error: TLE

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
int h, w, n;

void drop(vector<string> &cp) {
  for (int j = 0; j < w; j++) {
    int empcnt = 0;
    for (int i = h - 1; i >= 0; i--) {
      if (cp[i][j] == '.')
        empcnt++;
      else if (empcnt > 0) {
        cp[i + empcnt][j] = cp[i][j];
        cp[i][j] = '.';
      }
    }
  }
  return;
}

bool clear(vector<string> &cp) {
  bool cleared = false;
  vector<vector<int>> cl(h, vector<int>(w, 0));
  for (int i = 0; i < h; i++) {
    int prec = '&' - 'A';
    int cnt = 0;
    for (int j = 0; j < w; j++) {
      if (prec == (cp[i][j] - 'A')) {
        cnt++;
      } else {
        if (cnt >= n) {
          for (int k = j - cnt; k < j; k++) {
            cl[i][k] = true;
          }
        }
        if (isalpha(cp[i][j])) {
          prec = (cp[i][j] - 'A');
          cnt = 1;
        } else {
          cnt = -10000;
          prec = '&' - 'A';
        }
      }
    }
    if (prec != '&' - 'A' && cnt >= n) {
      for (int k = w - cnt; k < w; k++) {

        cl[i][k] = true;
      }
    }
  }

  for (int j = 0; j < w; j++) {
    int prec = '&' - 'A';
    int cnt = -10000;
    for (int i = 0; i < h; i++) {
      if (prec == (cp[i][j] - 'A')) {

        cnt++;
      } else {
        if (cnt >= n) {
          for (int k = i - cnt; k < i; k++) {
            cl[k][j] = true;
          }
        }
        if (isalpha(cp[i][j])) {
          cnt = 1;
          prec = (cp[i][j] - 'A');
        } else {
          cnt = -10000;
          prec = '&' - 'A';
        }
      }
    }
    if (prec != '&' - 'A' && cnt >= n) {
      for (int k = h - cnt; k < h; k++) {
        cl[k][j] = true;
      }
    }
  }
  for (int i = 0; i < h; i++) {
    for (int j = 0; j < w; j++) {
      if (cl[i][j]) {
        cp[i][j] = '.';
        cleared = false;
      }
    }
  }
  return cleared;
}

int times = 0;
bool check(vector<string> &cp) {
  times++;
  assert(times < 500);
  bool no_block = true;
  for (int i = 0; i < h; i++) {
    for (int j = 0; j < w; j++) {
      no_block = (no_block && cp[i][j] == '.');
    }
  }
  if (no_block)
    return true;
  drop(cp);
  if (!clear(cp))
    return false;
  return check(cp);
}

int main() {
  while (cin >> h >> w >> n, h) {
    vector<string> b(h);
    for (int i = 0; i < h; i++)
      cin >> b[i];
    bool res = false;
    for (int i = 0; i < h; i++) {
      for (int j = 0; j < w - 1; j++) {
        times = 0;
        vector<string> cp = b;
        swap(cp[i][j], cp[i][j + 1]);
        res = res || check(cp);
        if (res) {
          j = w;
          i = h;
        }
      }
    }
    cout << (res ? "YES" : "NO") << endl;
  }
  return 0;
}