Problem:
Reverse Sort

1 ∼ NまでのN個の数字の順列A1, A2, ……, ANが与えられる。
この順列に対して区間[i, j](1 ≤ i ≤ j ≤ N)の数字の順序を逆順にする操作reverse(i, j)を行うことが出来る。
例えば、[1, 2, 3, 4, 5]に対してreverse(2, 4)を適用すると[1, 4, 3, 2, 5]となる。
最小で何回の操作を行えば順列を昇順にソートされた状態にすることが出来るか計算せよ。

Input

入力は以下の形式で与えられる。

N
A1 A2 …… AN

Constraints

Nは整数である

2 ≤ N ≤ 10

Output

問題の解を1行に出力せよ。

Sample Input 1

5
1 4 3 5 2

Output for the Sample Input 1

2

reverse(4,5):1 4 3 2 5

reverse(2,4):1 2 3 4 5

のようにすればよい。

Sample Input 2

5
3 1 5 2 4

Output for the Sample Input 2

4

例えば

reverse(1,2):1 3 5 2 4

reverse(3,5):1 3 4 2 5

reverse(2,4):1 2 4 3 5

reverse(3,4):1 2 3 4 5

のようにすればよい。

Sample Input 3

3
1 2 3

Output for the Sample Input 3

0

Sample Input 4

10
3 1 5 2 7 4 9 6 10 8

Output for the Sample Input 4

9

Solution in C++ (judge verdict: Wrong Answer)

#include <iostream>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <string>

using namespace std;

typedef long long lli;
typedef pair<lli, int> P;
lli n, in;
vector<lli> input;
map<lli, int> data;
set<lli> vis;

lli rev(lli num, int a, int b){
  string str;
  while(num > 0){
    str += (char)((int)(num % 10LL) + '0');
    num /= 10LL;
  }
  if(str.size() != n) str = "0" + str;
  reverse(str.begin(), str.end());
  reverse(str.begin() + a, str.begin() + b + 1);
  lli res = 0;
  for(int i=0;i<str.size();i++){
    res *= 10LL;
    res += (lli)(str[i] - '0');
  }
  //return atoi(str.c_str());
  return res;
}

int solve(){
  lli state = 0;
  for(int i=0;i<n;i++){
    state *= 10;
    if(input[i] != 10) state += input[i];
  }
  if(data.find(state) != data.end()) return data[state];
  vis.clear();
  P u = P(state, 0), v;
  queue<P> q;
  q.push(u);
  while(!q.empty()){
    u = q.front();
    q.pop();
    //if(data.find(u.first) != data.end()) return data[u.first] + u.second;
    for(int i=0;i<n;i++){
      for(int j=0;j<n;j++){
        if(i == j) continue;
        v = u;
        v.second++;
        v.first = rev(v.first, i, j);
        if(vis.find(v.first) == vis.end()){
          if(data.find(v.first) != data.end()) return data[v.first] + v.second + 1;
          if(v.second < 4) q.push(v);
        }
      }
    }
  }
  return 9;
}

void init(){
  data.clear();
  lli state = 0;
  for(int i=1;i<=n;i++){
    state *= 10;
    if(i != 10) state += i;
  }
  P u = P(state, 0), v;
  queue<P> q;
  q.push(u);
  data[state] = 0;
  while(!q.empty()){
    u = q.front();
    q.pop();
    //cout << u.first << ' ' << u.second << endl;
    for(int i=0;i<n;i++){
      for(int j=0;j<n;j++){
        if(i == j) continue;
        v = u;
        v.second++;
        v.first = rev(v.first, i, j);
        if(data.find(v.first) == data.end()){
          data[v.first] = v.second;
          if(v.second < 4) q.push(v);
        }
      }
    }
  }
}

main(){
  while(cin >> n){
    input.clear();
    for(int i=0;i<n;i++){
      cin >> in;
      input.push_back(in);
    }
    init();
    cout << solve() << endl;
  }
}