1 条题解
-
0
#include <iostream> #include <string> using namespace std; string s; // 输入的原始字符串(升序,保证字典序输出) string res; // 存储当前生成的排列,按位置赋值实现回溯 bool vis[10]; // 标记数组,vis[i]=true表示s[i]已被使用 // [1] 深度优先搜索函数,pos表示当前要填充排列的第pos个位置 void dfs(int pos) { // 递归终止条件:填充完所有位置,生成完整排列 if (pos == s.size()) { cout << res << endl; return; } // [2] 遍历所有字符,尝试选择未使用的字符填充当前位置 for (int i = 0; i < s.size(); i++) { // 跳过已被使用的字符 if (!vis[i]) { vis[i] = true; // 标记字符为已使用 res[pos] = s[i]; // 直接给第pos位赋值,替代res+=s[i] dfs(pos + 1); // 递归填充下一个位置 // [3] 回溯:仅恢复标记,无需删除字符(下一次赋值会直接覆盖当前pos位) vis[i] = false; } } } int main() { cin >> s; res.resize(s.size()); // 初始化res长度与原字符串一致,保证pos索引有效 dfs(0); // 从第0个位置开始深搜生成排列 return 0; }
- 1
信息
- ID
- 1276
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者