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

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

char sheet[10][10];
char buf[12][10][10];
int ans[12][3];
int sum;

inline bool check(int x, int y, int s) {
  if (!sheet[y][x] || !sheet[y][x + 1] || !sheet[y + 1][x] ||
      !sheet[y][x - 1] || !sheet[y - 1][x])
    return false;
  if (!s)
    return true;
  if (!sheet[y + 1][x + 1] || !sheet[y - 1][x + 1] || !sheet[y + 1][x - 1] ||
      !sheet[y - 1][x - 1])
    return false;
  if (s == 1)
    return true;
  if (!sheet[y][x + 2] || !sheet[y + 2][x] || !sheet[y][x - 2] ||
      !sheet[y - 2][x])
    return false;
  return true;
}

inline void absorb(int x, int y, int s) {
  --sheet[y][x];
  --sheet[y][x + 1];
  --sheet[y + 1][x];
  --sheet[y][x - 1];
  --sheet[y - 1][x];
  if (!s)
    return;
  --sheet[y + 1][x + 1];
  --sheet[y - 1][x + 1];
  --sheet[y + 1][x - 1];
  --sheet[y - 1][x - 1];
  if (s == 1)
    return;
  --sheet[y][x + 2];
  --sheet[y + 2][x];
  --sheet[y][x - 2];
  --sheet[y - 2][x];
}

bool dfs(int x, int y, int s, int n) {
  bool r = false;
  char ds, w;
  if (!s) {
    ds = 5;
    w = 1;
  } else if (s == 1) {
    ds = 9;
    w = 1;
  } else {
    ds = 13;
    w = 2;
  }

  if (check(x, y, s)) {
    ans[n][0] = x;
    ans[n][1] = y;
    ans[n][2] = s + 1;
    memcpy(&buf[n][0][0], sheet, sizeof(char) * 100);
    absorb(x, y, s);
    sum -= ds;
    if (!n)
      r = !sum;
    else
      r = dfs(x, y, s, n - 1);
    if (r)
      return r;
    memcpy(sheet, &buf[n][0][0], sizeof(char) * 100);
    sum += ds;
  }
  if (x < 9 - w) {
    r = dfs(x + 1, y, s, n);
  } else if (y < 9 - w) {
    r = dfs(w, y + 1, s, n);
  } else if (s) {
    r = dfs(1, 1, s - 1, n);
  }
  return r;
}

int main() {
  int m, t;
  sum = 0;
  cin >> m;
  for (int i = 0; i < 10; i++) {
    for (int j = 0; j < 10; j++) {
      cin >> t;
      sum += t;
      sheet[i][j] = (char)t;
    }
  }
  dfs(2, 2, 2, m - 1);
  for (int i = 0; i < m; i++) {
    cout << ans[i][0] << " " << ans[i][1] << " " << ans[i][2] << endl;
  }
}

Error: TLE

Fixed submission:

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

int ds[3] = {5, 9, 13};
int w[3] = {1, 1, 2};
int dpx[13] = {0, 1, 0, -1, 0, 1, -1, -1, 1, 2, 0, -2, 0};
int dpy[13] = {0, 0, 1, 0, -1, 1, 1, -1, -1, 0, 2, 0, -2};
int sheet[10][10];
int sum;
int ans[12][3];
int buf[12][10][10];

bool check(int x, int y, int s) {
  for (int i = 0; i < ds[s]; i++) {
    if (!sheet[y + dpy[i]][x + dpx[i]])
      return false;
  }
  return true;
}

void absorb(int x, int y, int s) {
  for (int i = 0; i < ds[s]; i++) {
    --sheet[y + dpy[i]][x + dpx[i]];
  }
}

void drop(int x, int y, int s) {
  for (int i = 0; i < ds[s]; i++) {
    ++sheet[y + dpy[i]][x + dpx[i]];
  }
}

bool dfs(int x, int y, int s, int n) {
  bool r = false;
  if (check(x, y, s)) {
    ans[n][0] = x;
    ans[n][1] = y;
    ans[n][2] = s + 1;
    memcpy(&buf[n][0][0], sheet, sizeof(int) * 100);
    absorb(x, y, s);
    sum -= ds[s];
    if (!n)
      r = !sum;
    else
      r = dfs(x, y, s, n - 1);
    if (r)
      return r;
    memcpy(sheet, &buf[n][0][0], sizeof(int) * 100);
    // drop(x, y, s);
    sum += ds[s];
  }
  if (x < 9 - w[s]) {
    r = dfs(x + 1, y, s, n);
  } else if (y < 9 - w[s]) {
    r = dfs(w[s], y + 1, s, n);
  } else if (s) {
    r = dfs(w[s - 1], w[s - 1], s - 1, n);
  }
  return r;
}

int main() {
  int m;
  sum = 0;
  cin >> m;
  for (int i = 0; i < 10; i++) {
    for (int j = 0; j < 10; j++) {
      cin >> sheet[i][j];
      sum += sheet[i][j];
    }
  }
  dfs(2, 2, 2, m - 1);
  for (int i = 0; i < m; i++) {
    cout << ans[i][0] << " " << ans[i][1] << " " << ans[i][2] << endl;
  }
}