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

#include <algorithm>
#include <fstream>
#include <iostream>
#include <stdio.h>
#include <vector>

using namespace std;

int n;
char s, t, b;

typedef pair<int, int> Pair;

double calc() {

  char floar[3][3];
  floar[0][0] = 'A';
  floar[0][1] = 'B';
  floar[0][2] = 'C';
  floar[1][0] = 'D';
  floar[1][1] = 'E';
  floar[1][2] = 'F';
  floar[2][0] = 'G';
  floar[2][1] = 'H';
  floar[2][2] = 'I';

  pair<int, int> startPlace;
  pair<int, int> finPlace;
  pair<int, int> wareHouse;

  for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 3; j++) {
      if (floar[i][j] == s) {
        startPlace.first = i;
        startPlace.second = j;
      } else if (floar[i][j] == t) {
        finPlace.first = i;
        finPlace.second = j;
      } else if (floar[i][j] == b) {
        wareHouse.first = i;
        wareHouse.second = j;
      }
    }
  }

  vector<Pair> placeList;
  vector<Pair> nextPlaceList;

  placeList.push_back(startPlace);
  int leaveBattery = n;
  pair<int, int> newPlace;

  int trueCount = 0;
  int falseCount = 0;

  int placeCount[3][3];
  int nextPlaceCount[3][3];

  for (int i = 0; i < 3; i++) {
    fill(placeCount[i], placeCount[i] + 3, 0);
    fill(nextPlaceCount[i], nextPlaceCount[i] + 3, 0);
  }

  placeCount[startPlace.first][startPlace.second] = 1;

  while (leaveBattery) {
    if (leaveBattery == 1) {
      for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
          falseCount += placeCount[i][j];
        }
      }
      falseCount = falseCount * 4;
    }

    // ツ配ツ療アツづ個陳身ツづーツ暗堋督ョツつオツづつ「ツつュ
    for (int i = 0; i < 3; i++) {
      for (int j = 0; j < 3; j++) {
        if (placeCount[i][j] >= 1) {
          // ツ湘」ツづ可暗堋督ョ
          if (i - 1 >= 0 &&
              !(i - 1 == wareHouse.first && j == wareHouse.second)) {
            nextPlaceCount[i - 1][j] += placeCount[i][j];
          } else
            nextPlaceCount[i][j] += placeCount[i][j];
          // ツ可コ
          if (i + 1 < 3 && !(i + 1 == wareHouse.first && j == wareHouse.second))
            nextPlaceCount[i + 1][j] += placeCount[i][j];
          else
            nextPlaceCount[i][j] += placeCount[i][j];
          // ツ債カ
          if (j - 1 >= 0 &&
              !(i == wareHouse.first && j - 1 == wareHouse.second))
            nextPlaceCount[i][j - 1] += placeCount[i][j];
          else
            nextPlaceCount[i][j] += placeCount[i][j];
          // ツ右
          if (j + 1 < 3 && !(i == wareHouse.first && j + 1 == wareHouse.second))
            nextPlaceCount[i][j + 1] += placeCount[i][j];
          else
            nextPlaceCount[i][j] += placeCount[i][j];
        }
      }
    }

    for (int i = 0; i < 3; i++) {
      for (int j = 0; j < 3; j++) {
        placeCount[i][j] = nextPlaceCount[i][j];
        nextPlaceCount[i][j] = 0;
      }
    }

    leaveBattery--;
  }

  trueCount = placeCount[finPlace.first][finPlace.second];

  return (double)trueCount / falseCount;
}

void solve() {
  // ifstream ifs("prob1020.txt");
  while (1) {
    // ifs >> n;
    cin >> n;

    if (n == 0)
      break;
    cin >> s;
    cin >> t;
    cin >> b;
    // ifs >> s;
    // ifs >> t;
    // ifs >> b;
    double result = calc();
    printf("%.8f\\n", result);
  }
}

int main() {
  solve();
  return 0;
}

Error: TLE

Fixed submission:

#include <fstream>
#include <iostream>
#include <vector>

using namespace std;

int n;
char s, t, b;

typedef pair<int, int> Pair;

double calc() {

  char floar[3][3];
  floar[0][0] = 'A';
  floar[0][1] = 'B';
  floar[0][2] = 'C';
  floar[1][0] = 'D';
  floar[1][1] = 'E';
  floar[1][2] = 'F';
  floar[2][0] = 'G';
  floar[2][1] = 'H';
  floar[2][2] = 'I';

  pair<int, int> startPlace;
  pair<int, int> finPlace;
  pair<int, int> wareHouse;

  for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 3; j++) {
      if (floar[i][j] == s) {
        startPlace.first = i;
        startPlace.second = j;
      } else if (floar[i][j] == t) {
        finPlace.first = i;
        finPlace.second = j;
      } else if (floar[i][j] == b) {
        wareHouse.first = i;
        wareHouse.second = j;
      }
    }
  }

  vector<Pair> placeList;
  vector<Pair> nextPlaceList;

  placeList.push_back(startPlace);
  int leaveBattery = n;
  pair<int, int> newPlace;

  int trueCount = 0;
  int falseCount = 0;
  while (placeList.size()) {
    // àµobe[ª0ÆÈÁ½ç
    if (leaveBattery == 0) {
      // »ÝÊuªobeÌêÌ¨ð¦é
      for (int i = 0; i < placeList.size(); i++) {
        if (placeList[i].first == finPlace.first &&
            placeList[i].second == finPlace.second) {
          trueCount++;
        }
      }
      break;
    } else if (leaveBattery == 1) {
      falseCount = placeList.size() * 4;
    }
    for (int i = 0; i < placeList.size(); i++) {
      // ãAºA¶AEÉÍÝoµÄ¢È¢êA©ÂqÉÅÈ¢ê»ÌûüÉÚ®
      if (placeList[i].first - 1 >= 0) {
        if (wareHouse.first != placeList[i].first - 1 ||
            wareHouse.second != placeList[i].second) {
          newPlace.first = placeList[i].first - 1;
          newPlace.second = placeList[i].second;
          nextPlaceList.push_back(newPlace);
        } else {
          nextPlaceList.push_back(placeList[i]);
        }
      }
      if (placeList[i].first + 1 < 3) {
        if (wareHouse.first != placeList[i].first + 1 ||
            wareHouse.second != placeList[i].second) {
          newPlace.first = placeList[i].first + 1;
          newPlace.second = placeList[i].second;
          nextPlaceList.push_back(newPlace);
        } else {
          nextPlaceList.push_back(placeList[i]);
        }
      }
      if (placeList[i].second - 1 >= 0) {
        if (wareHouse.first != placeList[i].first ||
            wareHouse.second != placeList[i].second - 1) {
          newPlace.first = placeList[i].first;
          newPlace.second = placeList[i].second - 1;
          nextPlaceList.push_back(newPlace);
        } else {
          nextPlaceList.push_back(placeList[i]);
        }
      }
      if (placeList[i].second + 1 < 3) {
        if (wareHouse.first != placeList[i].first ||
            wareHouse.second != placeList[i].second + 1) {
          newPlace.first = placeList[i].first;
          newPlace.second = placeList[i].second + 1;
          nextPlaceList.push_back(newPlace);
        } else {
          nextPlaceList.push_back(placeList[i]);
        }
      }
    }
    leaveBattery--;
    placeList = nextPlaceList;
    nextPlaceList.clear();
  }
  return (double)trueCount / falseCount;
}

void solve() {
  // ifstream ifs("prob1020.txt");
  while (1) {
    // ifs >> n;
    cin >> n;

    if (n == 0)
      break;
    cin >> s;
    cin >> t;
    cin >> b;
    // ifs >> s;
    // ifs >> t;
    // ifs >> b;
    cout << calc() << endl;
  }
}

int main() {
  solve();
  return 0;
}