sicily 1198

本文介绍了一种使用递归实现的全排列算法,并结合排序功能来生成并输出所有可能的字符串组合。通过设定标记数组避免重复元素,在每一步递归中选择尚未使用过的字符进行组合,最终将所有生成的组合存储到集合中并输出最小的一个。

全排+排序

#include <iostream> #include <cstring> #include <string> #include <set> using namespace std; string s[8]; int n; set<string> data; bool isVis[8]; string sub; void combin(int cur) { if(cur == n) { data.insert(sub); return; } for(int i = 0; i < n; i++) { if(!isVis[i]) { int beg = sub.size(); sub += s[i]; isVis[i] = true; combin(cur + 1); sub.erase(beg, sub.size()); isVis[i] = false; } } } int main() { int cases; cin >> cases; while(cases--) { cin >> n; sub.clear(); memset(isVis, false, sizeof(isVis)); data.clear(); for(int i = 0; i < n; i++) cin >> s[i]; combin(0); cout << *(data.begin()) << endl;; } return 0; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值