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

#include <iostream>
#include <stdlib.h>
using namespace std;

int p[5][5], x[11] = {1, 2, 3, 0, 1, 2, 3, 4, 1, 2, 3},
             y[11] = {1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3}, s, sx[2], sy[2],
             mx[4] = {1, 0, -1, 0}, my[4] = {0, -1, 0, 1}, lt;
int search(int t, int mx2, int my2, int mc) {
  int a, i, j, x2, y2, s2;
  if (s == 0) {
    if (lt > t)
      lt = t;
    return 1;
  }
  for (i = 0; i < 2; i++)
    for (j = 0; j < 4; j++) {
      x2 = sx[i] + mx[j];
      y2 = sy[i] + my[j];
      if (x2 < 0 || x2 > 4 || y2 < 0 || y2 > 4)
        continue;
      if (p[y2][x2] < 1 || (mc == i && mx2 == -mx[j] && my2 == -my[j]))
        continue;
      s2 = abs(sx[i] - x[p[y2][x2] - 1]) + abs(sy[i] - y[p[y2][x2] - 1]) -
           (abs(x2 - x[p[y2][x2] - 1]) + abs(y2 - y[p[y2][x2] - 1]));
      if (s + s2 > lt - t)
        continue;
      p[sy[i]][sx[i]] = p[y2][x2];
      p[y2][x2] = 0;
      s += s2;
      sx[i] = x2;
      sy[i] = y2;
      a = search(t + 1, mx[j], my[j], i);
      sx[i] = x2 - mx[j];
      sy[i] = y2 - my[j];
      p[y2][x2] = p[sy[i]][sx[i]];
      p[sy[i]][sx[i]] = 0;
      s -= s2;
      if (a == 1)
        return 0;
    }
  return 0;
}

int main() {
  int i, j, k;
  for (i = 0; i < 5; i++)
    for (j = 0; j < 5; j++)
      p[i][j] = -1;
  while (cin >> p[0][2] && p[0][2] != -1) {
    cin >> p[1][1] >> p[1][2] >> p[1][3];
    cin >> p[2][0] >> p[2][1] >> p[2][2] >> p[2][3] >> p[2][4];
    cin >> p[3][1] >> p[3][2] >> p[3][3];
    cin >> p[4][2];
    k = 0;
    s = 0;
    for (i = 0; i < 5; i++)
      for (j = 0; j < 5; j++) {
        if (p[i][j] == 0) {
          sx[k] = j;
          sy[k] = i;
          k++;
        }
        if (p[i][j] > 0)
          s += abs(j - x[p[i][j] - 1]) + abs(i - y[p[i][j] - 1]);
      }
    lt = 21;
    search(0, 0, 0, 0);
    if (lt == 21)
      cout << "NA" << endl;
    else
      cout << lt << endl;
  }
  return 0;
}

Error: TLE

Fixed submission:

#include <iostream>
#include <stdlib.h>
using namespace std;

int p[5][5], x[11] = {1, 2, 3, 0, 1, 2, 3, 4, 1, 2, 3},
             y[11] = {1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3}, s, sx[2], sy[2],
             mx[4] = {1, 0, -1, 0}, my[4] = {0, -1, 0, 1}, lt;
int search(int t, int mx2, int my2, int mc) {
  int a, i, j, x2, y2, s2;
  if (t - 1 >= lt)
    return 0;
  if (s == 0) {
    lt = t - 1;
    return 1;
  }
  for (i = 0; i < 2; i++)
    for (j = 0; j < 4; j++) {
      x2 = sx[i] + mx[j];
      y2 = sy[i] + my[j];
      if (x2 < 0 || x2 > 4 || y2 < 0 || y2 > 4)
        continue;
      if (p[y2][x2] < 1 || (mc == i && mx2 == -mx[j] && my2 == -my[j]))
        continue;
      s2 = abs(x2 - x[p[y2][x2] - 1]) + abs(y2 - y[p[y2][x2] - 1]) -
           abs(sx[i] - x[p[y2][x2] - 1]) - abs(sy[i] - y[p[y2][x2] - 1]);
      if (s - s2 > lt)
        continue;
      p[sy[i]][sx[i]] = p[y2][x2];
      p[y2][x2] = 0;
      s += s2;
      sx[i] = x2;
      sy[i] = y2;
      a = search(t + 1, mx[j], my[j], i);
      sx[i] = x2 - mx[j];
      sy[i] = y2 - my[j];
      p[y2][x2] = p[sy[i]][sx[i]];
      p[sy[i]][sx[i]] = 0;
      s -= s2;
      if (a == 1)
        return 0;
    }
  return 0;
}

int main() {
  int i, j, k;
  for (i = 0; i < 5; i++)
    for (j = 0; j < 5; j++)
      p[i][j] = -1;
  while (cin >> p[0][2] && p[0][2] != -1) {
    cin >> p[1][1] >> p[1][2] >> p[1][3];
    cin >> p[2][0] >> p[2][1] >> p[2][2] >> p[2][3] >> p[2][4];
    cin >> p[3][1] >> p[3][2] >> p[3][3];
    cin >> p[4][2];
    k = 0;
    s = 0;
    for (i = 0; i < 5; i++)
      for (j = 0; j < 5; j++) {
        if (p[i][j] == 0) {
          sx[k++] = j;
          sy[k++] = i;
        }
        if (p[i][j] > 0)
          s += abs(j - x[p[i][j] - 1]) + abs(i - y[p[i][j] - 1]);
      }
    lt = 21;
    search(1, 0, 0, 0);
    if (lt == 21)
      cout << "NA" << endl;
    else
      cout << lt << endl;
  }
  return 0;
}