全排列的变换
Time Limit: 1000 ms
Memory Limit: 65536 KiB
Problem Description
小鑫今天从玄黄那里拿到了一个长度为n的全排列,可是小鑫不喜欢这个全排列,于是小鑫想要把这个全排列变成他希望的样子。
但是全排列不是随便就能变换的,全排列每次变换只能交换相邻的两个数位。例如:123可以通过一步变换变成132,但是不能通过一步变换变成321。
现在你能帮助小鑫把他从玄黄那里拿到的全排列变成他希望的样子吗?小鑫想知道最少需要多少步变换才能将手里的全排列变成他希望的样子。
Input
第一行输入一个整数n(3<=n<=9),代表全排列的长度。
第二行输入一个长度为n的全排列,相邻两个数字之间用空格隔开,代表这是小鑫开始获得的全排列。
第三行输入一个长度为n的全排列,相邻两个数字之间用空格隔开,代表小鑫希望获得的全排列。
Output
输出一个整数,代表从第一个全排列变成第二个全排列最少需要进行的变换次数。
Sample Input
4 1 2 4 3 3 2 1 4
Sample Output
4
Hint
第一步,将1和2交换变为2 1 4 3
第二步,将4和3交换变为2 1 3 4
第三步,将1和3交换变为2 3 1 4
第四步,将2和3交换变为3 2 1 4
Source
#include <iostream> #include <cstdio> #include <bits/stdc++.h> using namespace std; int main() { int a[12],b[12]; int n,i,j; cin>>n; int ans = 0; for(i=1;i<=n;i++) cin>>a[i]; for(j=1;j<=n;j++) cin>>b[j]; for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { if(a[i]==b[j]) { //cout<<a[i]<< " "<<a[j]<<" "<<j<<endl; a[i] = j; break; } } } for(i=1;i<=n;i++) { for(j=1;j<=n-i;j++) { if(a[j] > a[j+1]) { int t =a[j]; a[j] = a[j+1]; a[j+1] = t; ans++; } } } cout<<ans<<endl; return 0; }