题解 | #牛牛嚯可乐#

牛牛嚯可乐

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;
}

全部评论

相关推荐

Natrium_:这时间我以为飞机票
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务