17暑假练习赛2 Codeforces Round #501 (Div. 3) 1015B
![](https://img-blog.csdn.net/20180803234009219?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTE1OTA1NzM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
![](https://img-blog.csdn.net/20180803234039359?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTE1OTA1NzM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
![](https://img-blog.csdn.net/20180803234052848?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTE1OTA1NzM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
题意:一个字符只可以和它身后的字符进行交换,从一个字符串A变成C,一共得进行多少次交换,输出次数和每次交换的位置。
分析:如果字母不相邻可以用冒泡一个个的向前移动,如何向前移动?倒着写冒泡就好啦~
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 55;
int n;
char s[MAXN], t[MAXN];
vector<int> v;
int main()
{
ios::sync_with_stdio(false);
cin >> n;
for (int i = 1; i <= n; i++)
cin >> s[i];
for (int i = 1; i <= n; i++)
cin >> t[i];
for (int i = 1; i <= n; i++)
{
if (s[i] == t[i])
continue;
bool ch = 0;
for (int j = i + 1; j <= n; j++)
{
if (s[j] == t[i])
{
for (int k = j - 1; k >= i; k--)
{
v.push_back(k);
swap(s[k], s[k + 1]);
}
ch = 1;
}
if (ch == 1)
break;
}
if (!ch)
{
cout << -1 << endl;
exit(0);
}
}
cout << v.size() << endl;
int sz = v.size();
for (int i = 0; i < sz; i++)
cout << v[i] << " ";
cout << endl;
return 0;
}