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

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <string>
#include <vector>
using namespace std;
typedef pair<string, int> P;

int iti;
string n;
map<string, int> m;
queue<P> que;
map<string, int>::iterator ite;

void solve() {
  que.push(P("01234567", 0));
  m.insert(make_pair("01234567", 0));
  while (que.size()) {
    P p = que.front();
    que.pop();
    for (int i = 0; i < 8; i++) {
      if (p.first[i] == '0')
        iti = i;
    }
    if (iti != 3 && iti != 7) {
      swap(p.first[iti], p.first[iti + 1]);
      ite = m.find(p.first);
      if (ite == m.end()) {
        que.push(P(p.first, p.second + 1));
        m.insert(make_pair(p.first, p.second + 1));
      }
      swap(p.first[iti], p.first[iti + 1]);
    }
    if (iti != 0 && iti != 4) {
      swap(p.first[iti], p.first[iti - 1]);
      ite = m.find(p.first);
      if (ite == m.end()) {
        que.push(P(p.first, p.second + 1));
        m.insert(make_pair(p.first, p.second + 1));
      }
      swap(p.first[iti], p.first[iti - 1]);
    }
    if (iti <= 3) {
      swap(p.first[iti + 4], p.first[iti]);
      ite = m.find(p.first);
      if (ite == m.end()) {
        que.push(P(p.first, p.second + 1));
        m.insert(make_pair(p.first, p.second + 1));
      }
      swap(p.first[iti + 4], p.first[iti]);
    } else {
      swap(p.first[iti - 4], p.first[iti]);
      ite = m.find(p.first);
      if (ite == m.end()) {
        que.push(P(p.first, p.second + 1));
        m.insert(make_pair(p.first, p.second + 1));
      }
      swap(p.first[iti - 4], p.first[iti]);
    }
  }
}

int main() {
  solve();
  char trash;
  while (cin >> trash) {
    n.push_back(trash);
    for (int i = 1; i < 8; i++) {
      cin >> trash;
      n.push_back(trash);
    }
    cout << m[n] << endl;
    n.clear();
  }
}

Error: TLE

Fixed submission:

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <string>
#include <vector>
using namespace std;
typedef pair<string, int> P;

int iti;
string n;

void solve() {
  queue<P> que;
  set<string> m;
  set<string>::iterator ite;
  que.push(P(n, 0));
  m.insert(n);
  if (n == "01234567") {
    printf("%d\\n", 0);
    return;
  }
  while (true) {
    P p = que.front();
    que.pop();
    for (int i = 0; i < 8; i++) {
      if (p.first[i] == '0')
        iti = i;
    }
    if (iti != 3 && iti != 7) {
      swap(p.first[iti], p.first[iti + 1]);
      if (p.first == "01234567") {
        printf("%d\\n", p.second + 1);
        return;
      }
      ite = m.find(p.first);
      if (ite == m.end()) {
        que.push(P(p.first, p.second + 1));
        m.insert(p.first);
      }
      swap(p.first[iti], p.first[iti + 1]);
    }
    if (iti != 0 && iti != 4) {
      swap(p.first[iti], p.first[iti - 1]);
      if (p.first == "01234567") {
        printf("%d\\n", p.second + 1);
        return;
      }
      ite = m.find(p.first);
      if (ite == m.end()) {
        que.push(P(p.first, p.second + 1));
        m.insert(p.first);
      }
      swap(p.first[iti], p.first[iti - 1]);
    }
    if (iti <= 3) {
      swap(p.first[iti + 4], p.first[iti]);
      if (p.first == "01234567") {
        printf("%d\\n", p.second + 1);
        return;
      }
      ite = m.find(p.first);
      if (ite == m.end()) {
        que.push(P(p.first, p.second + 1));
        m.insert(p.first);
      }
      swap(p.first[iti + 4], p.first[iti]);
    } else {
      swap(p.first[iti - 4], p.first[iti]);
      if (p.first == "01234567") {
        printf("%d\\n", p.second + 1);
        return;
      }
      ite = m.find(p.first);
      if (ite == m.end()) {
        que.push(P(p.first, p.second + 1));
        m.insert(p.first);
      }
      swap(p.first[iti - 4], p.first[iti]);
    }
  }
}

int main() {
  char trash;
  while (cin >> trash) {
    n.push_back(trash);
    for (int i = 1; i < 8; i++) {
      cin >> trash;
      n.push_back(trash);
    }
    solve();
    n.clear();
  }
}