题解 | #牛牛嚯可乐#
牛牛嚯可乐
https://ac.nowcoder.com/acm/contest/11179/B
数据范围很小且保证一定有解,考虑爆搜
枚举到第u个字符时,若第u个字符与目的字符不一致,到后面的位置找一个与当前位置匹配的字符并交换。(因为前面的已经完全匹配了,所以只要找后面)
代码入下
#include <iostream>
#include <cstring>
#include <cstdio>
#include <climits>
#define x first
#define y second
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
const int N = 10;
char s[N] = "cocacola", t[N];
int n, m;
int ans = 1e9;
void dfs(int u, int sum) {//枚举到第u个字符,且t[1..u-1]已经和目的字符串s的前缀匹配的交换次数为sum
if (u >= 8) {//匹配完所有字符
ans = min(ans, sum);
return ;
}
if (s[u] != t[u]) {//第u个字符不匹配
for (int i = u + 1; i < 8; i ++) { //到后面找到与s[u]一致的字符
if (s[u] != t[i]) continue;
swap(t[u], t[i]); //交换两个位置的字符
dfs(u + 1, sum + 1); //递归下一个字符
swap(t[u], t[i]); //换回来,消除对下次决策的影响
}
}
else dfs(u + 1, sum); //若匹配无需交换字符
}
int main() {
cin >> t;
dfs(0, 0);
cout << ans;
return 0;
}