#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
using namespace std;
int bfs(vector<int>& perm);
int main()
{
int caseNum;
cin >> caseNum;
cin.ignore();
for (int cIter = 0; cIter < caseNum; cIter++)
{
int n;
cin >> n;
vector<int> items;
int input_item;
for (int nIter = 0; nIter < n; nIter++)
{
cin >> input_item;
items.push_back(input_item);
}
int shortest_distance = bfs(items);
cout << shortest_distance << endl;
}
}
int bfs(vector<int>& perm)
{
int n = perm.size();
vector<int> sorted = perm;
sort(perm.begin(), perm.end());
queue<vector<int>> q;
map<vector<int>, int> distance;
distance[perm] = 0;
q.push(perm);
while (!q.empty())
{
vector<int> here = q.front();
q.pop();
if (here == sorted) return distance[here];
int cost = distance[here];
for (int i = 0; i < n; i++)
{
for (int j = i + 2; j <= n; j++)
{
reverse(here.begin() + i, here.begin() + j);
if (distance.count(here) == 0)
{
distance[here] = cost + 1;
q.push(here);
}
reverse(here.begin() + i, here.begin() + j);
}
}
}
return -1;
}
※ Sorting의 대상이 되는 입력값들은 모두 상대적인 크기 순서가 있다. n = 8 정도 일때의 BFS 값을 계산해두면 위의 코드를 실행할 때 굳이 n < 8 이하인 케이스들을 중복하여 계산할 필요가 없다.
반응형
'Algorithm > Graph - BFS' 카테고리의 다른 글
HANOI4B (0) | 2021.01.25 |
---|---|
CHILDRENDAY (0) | 2020.10.18 |