思路:
对任意一个线性序列,都由若干个"环"组成,所需的交换次数即环中元素个数 - 1,即n - 环的个数。
对任意一个线性序列,都由若干个"环"组成,所需的交换次数即环中元素个数 - 1,即n - 环的个数。
枚举每个开头,复杂度O(n^2)
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <fstream>
using namespace std;
const int maxn = 505;
int a[maxn];
int t[maxn];
bool vis[maxn];
int cnt;
void dfs(int idx) {
if(vis[idx]) return;
vis[idx] = true;
if(idx == t[idx] - 1) return;
dfs(t[idx] - 1);
}
int main() {
int n;
while(cin >> n) {
if(n == 0) break;
for(int i = 0; i < n; ++i) {
cin >> a[i];
}
int ans = maxn;
for(int i = 0; i < n; ++i) {
for(int j = 0; j < n; ++j)
t[j] = a[(i + j)%n];
memset(vis, 0, sizeof(vis));
cnt = 0;
for(int j = 0; j < n; ++j)
if(!vis[j]) dfs(j), ++cnt;
//printf("cnt = %d\n", cnt);
ans = min(ans, n - cnt);
reverse(t, t + n);
memset(vis, 0, sizeof(vis));
cnt = 0;
for(int j = 0; j < n; ++j)
if(!vis[j]) dfs(j), ++cnt;
ans = min(ans, n - cnt);
}
cout << ans << endl;
}
return 0;
}