调试关于排列的程序

Debug on Program about Permutation

最近我在写一个程序来生成固定数量的输入字母排列。比如我输入3、3、ABC,程序会按照字典序输出ABC、ACB、BAC。但是程序无法通过所有测试用例,我无法找出错误在哪里。请帮忙。

#include <iostream>
using namespace std;

int used[26], cou = 0, k, n, i;
string output;
string sorting(string x, int y)
{
    char temp;
    int i, j;
    for (i = 0; i < y; ++i)
    {
        for (j = 0; j < y-1; ++j)
        {
            if (x[j]-'0' > x[j+1]-'0')
           {
                temp = x[j];
                x[j] = x[j+1];
                x[j+1] = temp;
            }
        }
    }
    return x;
}

void out(int x, string y)
{
    int i;
    if (cou == k)
    {
        return;
    }
    if (x == n+1)
    {
        cout << output << endl;
        ++cou;
    }
    else
    {
        for (i = 0; i < n; ++i)
        {
            if (used[i] == 0)
            {
                used[i] = 1;
                output[x-1] = y[i];
                out(x+1, y);
                used[i] = 0;
            }
        }
    }
}

int main()
{
    char inpi;
    string inp, ha;
    cin >> n >> k >> inp;
    output.resize(n);
    for (i = 0; i < 26; ++i)
    {
        used[i] = 0;
    }
    inp = sorting(inp, n);
    out(1, inp);
}

我不确定我是否理解问题。

撇开算法不说,你应该知道一个标准的字符串是可以判断多长的。因此 sorting 中的 y 参数是多余的。使用 x.size() 查找尺寸。

另一个问题是output[x] = y[i];。您没有设置 output 的大小:它是零。由于您正在寻找排列,我假设它的大小必须等于 y 的大小:output.resize( y.size() );.

最后一件事:使用有意义的标识符。 y 可能对编译器有好处;对于一个人来说,它可能定义了糟糕的一天。

似乎没有必要像您那样创建全局 string output;

创建一个字符串以在 main() 中捕获输出并通过引用将其传递给需要它们的函数,在本例中为 fill() 要么 在 fill() 和 return 中创建它,一旦它被填充