C语言单词全排列代码求助:仅输出部分排列结果
问题分析与代码修正
你的代码逻辑完全偏离了全排列的正确生成思路,当前的相邻交换逻辑只能生成极有限的几种相邻调换结果,无法覆盖所有排列情况。全排列的核心是固定每个位置的元素,递归生成剩余部分的排列,也就是回溯法。
原代码的核心问题
- 仅做相邻元素交换,没有遍历所有位置的元素交换组合
- 逻辑中反复对比原字符串的判断完全无效,无法触发多轮排列生成
- 没有递归或循环处理每个位置的元素选择,只能处理开头的几次相邻交换
修正后的全排列代码
#include<stdio.h> void permute(char *s, int start, int end); void swap(char *a, char *b); int my_strlen(char *s); int main() { char s[10]; scanf("%[^\n]", s); int n = my_strlen(s); permute(s, 0, n - 1); return 0; } // 全排列核心函数:回溯法 void permute(char *s, int start, int end) { // 当start等于end时,当前排列已生成,打印 if (start == end) { printf("%s\n", s); return; } // 遍历从start到end的每个位置,作为当前start位置的元素 for (int i = start; i <= end; i++) { // 交换start和i位置的元素,固定当前位置 swap(&s[start], &s[i]); // 递归生成剩余部分的排列 permute(s, start + 1, end); // 回溯:交换回来,恢复原字符串,不影响下一轮循环 swap(&s[start], &s[i]); } } // 交换两个字符 void swap(char *a, char *b) { char temp = *a; *a = *b; *b = temp; } int my_strlen(char *s) { int c = 0; while (s[c] != '\0') c++; return c; }
代码解释
permute函数:
- 当
start == end时,说明已经完成了一次排列的构建,直接打印当前字符串 - 循环遍历从
start到end的每个索引i,交换start和i的元素,将第i个元素固定在当前start位置 - 递归调用
permute处理下一个位置(start+1),生成剩余部分的所有排列 - 递归返回后,交换回原来的元素(回溯),保证下一次循环时字符串状态正确
- 当
swap函数:简单的字符交换工具函数,用于排列过程中的元素调换
测试输入abcd时,这段代码会输出所有24种排列(4! = 24),完全覆盖你需要的所有情况。
内容的提问来源于stack exchange,提问作者user23427207
相关产品推荐
相关产品推荐

