题解 | #牛牛嚯可乐#

牛牛嚯可乐

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

全部评论

相关推荐

面试摇了我吧:啊哈哈面试提前五个小时发,点击不能参加就是放弃
点赞 评论 收藏
分享
一个菜鸡罢了:哥们,感觉你的简历还是有点问题的,我提几点建议,看看能不能提供一点帮助 1. ”新余学院“别加粗,课程不清楚是否有必要写,感觉版面不如拿来写一下做过的事情,教育经历是你的弱势就尽量少写 2. “干部及社团经历”和“自我评价”删掉 3. 论文后面的“录用”和“小修”啥的都删掉,默认全录用,问了再说,反正小修毕业前肯定能发出来 4. 工作经验和研究成果没有体现你的个人贡献,着重包装一下个人贡献
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务