You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

代码解释

  1. permute函数:

    • 当start == end时,说明已经完成了一次排列的构建,直接打印当前字符串
    • 循环遍历从start到end的每个索引i,交换start和i的元素,将第i个元素固定在当前start位置
    • 递归调用permute处理下一个位置(start+1),生成剩余部分的所有排列
    • 递归返回后,交换回原来的元素(回溯),保证下一次循环时字符串状态正确
  2. swap函数:简单的字符交换工具函数,用于排列过程中的元素调换

测试输入abcd时,这段代码会输出所有24种排列(4! = 24),完全覆盖你需要的所有情况。

内容的提问来源于stack exchange,提问作者user23427207

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 06:02:10