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

#include <algorithm>
#include <cstdio>
#include <string>

const int dx[3] = {0, 1, 0}, dy[3] = {1, 1, 2};
int N;
int cloth[10][10];
int x[12], y[12], type[12];

bool canFill(int cx, int cy, int t) {
  int mx;

  if (t == 0) {
    mx = 1;
  } else if (t == 1) {
    mx = 2;
  } else if (t == 2) {
    mx = 2;
  }

  for (int i = -mx; i <= mx; i++) {
    for (int j = -mx; j <= mx; j++) {
      if (std::abs(i) + std::abs(j) > mx) {
        continue;
      }
      if (t == 1 &&
          (i == 0 && std::abs(j) == 2 || std::abs(i) == 2 && j == 0)) {
        continue;
      }
      int x = j + cx, y = i + cy;
      if (x < 0 || x >= 10 || y < 0 || y >= 10) {
        return false;
      }
      if (!cloth[y][x]) {
        return false;
      }
    }
  }

  return true;
}

void spuit(int cx, int cy, int t, int v) {
  int mx;

  if (t == 0) {
    mx = 1;
  } else if (t == 1) {
    mx = 2;
  } else if (t == 2) {
    mx = 2;
  }

  for (int i = -mx; i <= mx; i++) {
    for (int j = -mx; j <= mx; j++) {
      if (std::abs(i) + std::abs(j) > mx) {
        continue;
      }
      if (t == 1 &&
          (i == 0 && std::abs(j) == 2 || std::abs(i) == 2 && j == 0)) {
        continue;
      }
      int x = j + cx, y = i + cy;
      if (x < 0 || x >= 10 || y < 0 || y >= 10) {
        continue;
      }
      cloth[y][x] -= v;
    }
  }
}

bool dfs(int n) {
  if (n == N) {
    for (int i = 0; i < 10; i++) {
      for (int j = 0; j < 10; j++) {
        if (cloth[i][j]) {
          return false;
        }
      }
    }

    for (int i = 0; i < N; i++) {
      printf("%d %d %d\\n", x[i], y[i], type[i]);
    }
    return true;
  }

  for (int i = 0; i < 10; i++) {
    for (int j = 0; j < 10; j++) {
      if (!cloth[i][j]) {
        continue;
      }
      for (int k = 0; k < 3; k++) {
        int cx = j + dx[k], cy = i + dy[k];
        if (!canFill(cx, cy, k)) {
          continue;
        }
        spuit(cx, cy, k, 1);

        x[n] = cx;
        y[n] = cy;
        type[n] = k + 1;
        if (dfs(n + 1)) {
          return true;
        }
        spuit(cx, cy, k, -1);
      }
      return false;
    }
  }

  return false;
}

int main() {
  scanf("%d", &N);

  for (int i = 0; i < 10; i++) {
    for (int j = 0; j < 10; j++) {
      scanf("%d", &cloth[i][j]);
    }
  }

  dfs(0);
}

Error: TLE

Fixed submission:

#include <bits/stdc++.h>
#define SIZE 300005
#define MOD 1000000007LL
#define INF 1 << 30
#define LLINF 1LL << 60
#define REP(i, n) for (int i = 0; i < n; i++)
#define FOR(i, a, b) for (int i = a; i <= b; i++)
#define DOWN(i, b, a) for (int i = b; i >= a; i--)
#define SET(a, c) memset(a, c, sizeof a)
#define FORALL(i, c)                                                           \\
  for (__typeof((c).begin()) i = (c).begin(); i != (c).end(); ++i)
#define FOREACH(i, c) for (auto(i) : (c))
#define BIT(i, j) ((i) >> (j)) & 1
#define ALL(o) (o).begin(), (o).end()
#define ERASE(o) (o).erase(unique((o).begin(), (o).end()), (o).end())
#define SQ(x) ((x) * (x))
using namespace std;
typedef long long ll;
typedef pair<ll, ll> Pll;
typedef pair<int, int> Pii;
typedef pair<double, double> Pdd;
typedef complex<double> dcomplex;
template <typename T> inline void priv(vector<T> a) {
  REP(i, a.size()) { cerr << a[i] << ((i == a.size() - 1) ? "\\n" : " "); }
}
ll gcd(ll a, ll b) {
  int c = max(a, b);
  int d = min(a, b);
  return c == 0 || d == 0 ? c : gcd(c % d, d);
}
ll lcm(ll a, ll b) { return a == 0 || b == 0 ? 0 : a * b / gcd(a, b); }
ll fact(ll a) {
  ll b = 1;
  FOR(i, 1, a) b *= i;
  return b;
}

int n;
int a[10][10];

bool canPos(int i, int j, int t) {
  switch (t) {
  case 3:
    if (i <= 1 || i >= 8 || j <= 1 || j >= 8)
      return false;
    FOR(k, -2, 2)
    FOR(l, -(2 - abs(k)), (2 - abs(k))) if (a[i + k][j + l] == 0) return false;
    return true;
  case 2:
    if (i <= 0 || i >= 9 || j <= 0 || j >= 9)
      return false;
    FOR(k, -1, 1) FOR(l, -1, 1) if (a[i + k][j + l] == 0) return false;
    return true;
  case 1:
    if (i <= 0 || i >= 9 || j <= 0 || j >= 9)
      return false;
    FOR(k, -1, 1)
    FOR(l, -(1 - abs(k)), 1 - abs(k)) if (a[i + k][j + l] == 0) return false;
    return true;
  default:
    return false;
  }
}

void turn(int i, int j, int t, int c) {
  switch (t) {
  case 3:
    FOR(k, -2, 2) FOR(l, -(2 - abs(k)), (2 - abs(k))) a[i + k][j + l] += c;
    break;
  case 2:
    FOR(k, -1, 1) FOR(l, -1, 1) a[i + k][j + l] += c;
    break;
  case 1:
    FOR(k, -1, 1) FOR(l, -(1 - abs(k)), 1 - abs(k)) a[i + k][j + l] += c;
  default:
    break;
  }
}

bool dfs(int n) {
  if (n == 0) {
    REP(i, 10) REP(j, 10) if (a[i][j] > 0) return false;
    return true;
  }
  FOR(i, 1, 8) FOR(j, 1, 8) if (a[i][j]) {
    FOR(t, 1, 3) if (canPos(i, j, t)) {
      turn(i, j, t, -1);
      if (dfs(n - 1)) {
        printf("%d %d %d\\n", j, i, t);
        return true;
      }
      turn(i, j, t, 1);
    }
  }
  return false;
}

int main() {
  cin >> n;
  REP(i, 10) REP(j, 10) cin >> a[i][j];
  dfs(n);
  return 0;
}