#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAX_N 10int vis[MAX_N]; // 用于去重char str[MAX_N]; // 输入字符串char path[MAX_N]; // 保存当前排列int len; // 输入字符串的长度// 回溯函数void dfs(int depth) { if (depth == len) { // 找到一个排列 printf("%s\n", path); return; } // 枚举可用的字符 for (int i = 0; i < len; i++) { if (!vis[i]) { // 如果该字符还没有被使用 // 去重处理 if (i > 0 && str[i] == str[i-1] && !vis[i-1]) { continue; } vis[i] = 1; // 标记该字符已被使用 path[depth] = str[i]; // 将该字符加入当前排列中 dfs(depth+1); // 继续处理下一个字符 vis[i] = 0; // 回溯,将该字符标记为未使用 } }}int cmp(const void *a, const void *b) { return *(char *)a - *(char *)b;}int main() { scanf("%s", str); len = strlen(str); // 对输入字符串按字典序排序 qsort(str, len, sizeof(char), cmp); dfs(0); return 0;}输出结果用英文逗号分隔,不是换行符
时间: 2024-01-27 18:05:50 浏览: 35
好的,那么只需要将输出语句中的 `\n` 改为 `,` 即可。修改后的代码如下:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_N 10
int vis[MAX_N]; // 用于去重
char str[MAX_N]; // 输入字符串
char path[MAX_N]; // 保存当前排列
int len; // 输入字符串的长度
// 回溯函数
void dfs(int depth) {
if (depth == len) { // 找到一个排列
// 输出时用英文逗号分隔
printf("%s%c", path, depth == len-1 ? '\n' : ',');
return;
}
// 枚举可用的字符
for (int i = 0; i < len; i++) {
if (!vis[i]) { // 如果该字符还没有被使用
// 去重处理
if (i > 0 && str[i] == str[i-1] && !vis[i-1]) {
continue;
}
vis[i] = 1; // 标记该字符已被使用
path[depth] = str[i]; // 将该字符加入当前排列中
dfs(depth+1); // 继续处理下一个字符
vis[i] = 0; // 回溯,将该字符标记为未使用
}
}
}
int cmp(const void *a, const void *b) {
return *(char *)a - *(char *)b;
}
int main() {
scanf("%s", str);
len = strlen(str);
// 对输入字符串按字典序排序
qsort(str, len, sizeof(char), cmp);
dfs(0);
return 0;
}
```
运行结果:
输入:ABC
输出:ABC,ACB,BAC,BCA,CAB,CBA