K. King’s Task
题目大意:
给定一个序列,要求对其进行两种操作,使得最后将它变为有序。
操作一:交换第
2
k
2k
2k个数和第
2
k
−
1
2k-1
2k−1个数。
操作二:交换第
k
k
k个数和第
k
+
n
k+n
k+n个数。
思路:
数据范围只有1000,而且时间给了三秒,我们可以用深搜来做,利用一个
v
e
c
t
o
r
vector
vector来存储序列,并对其进行变换,利用
f
i
r
s
t
first
first值为
v
e
c
t
o
r
vector
vector的
m
a
p
map
map来判断此序列是否出现过,更新答案即可。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<map>
#include<cmath>
#include<iomanip>
#include<queue>
using namespace std;
typedef long long ll;
const int p = 1e9 + 7;
typedef pair<int, int> pii;
const int N = 1e6+10;
int n;
map<vector<int>, int>mp;
int ans = 0x3f3f3f3f;
void dfs(vector<int> h,int u) {
int flag = 0;
for (int i = 0; i < n * 2; i++) {
if (h[i] != i + 1) {
flag = 1;
break;
}
}
if (!flag) {
ans = min(ans, u);
return ;
}
vector<int>t1(n*2), t2;
copy(h.begin() + n, h.end(), t1.begin());
copy(h.begin(), h.end() - n, t1.begin() + n);
for (vector<int>::iterator it = h.begin(); it != h.end(); it+=2) {
t2.push_back(*(it + 1)), t2.push_back(*it);
}
if (mp[t1] == 0) {
mp[t1]++;
dfs(t1, u + 1);
mp.erase(t1);
}
if (mp[t2] == 0) {
mp[t2]++;
dfs(t2, u + 1);
mp.erase(t2);
}
}
int main() {
cin >> n;
vector<int>p;
for (int i = 1; i <= n * 2; i++) {
int x;
cin >> x;
p.push_back(x);
}
mp[p]++;
dfs(p,0);
if (ans != 0x3f3f3f3f) {
cout << ans << endl;
}
else {
cout << -1 << endl;
}
}