giegie666 发表于 2023-4-4 15:09:40

为什么提交后有一处错误

给定一个含n(n>1)个整数(小于10)的数组a,所有元素都不相同,采用蛮力法从小到大输出所有的由这n个整数构成的n位整数。

输入格式:
第1行给出一个整数n。

第2行给出n个整数。

输出格式:
从小到大输出所有的由这n个整数构成的n位整数。

输入样例:
3
2 5 8
输出样例:
258 285 528 582 825 852


#include <stdio.h>
#include <stdlib.h>

int a, used, num;

void dfs(int step, int n)
{
    if (step == n + 1)
    {
      for (int i = 1; i <= n; i++)
            printf("%d", num);
      printf(" ");
      return;
    }

    for (int i = 1; i <= n; i++)
    {
      if (!used)
      {
            used = 1;
            num = a;
            dfs(step + 1, n);
            used = 0;
      }
    }
}

int main()
{
    int n;
    scanf("%d", &n);
   
    for (int i = 1; i <= n; i++)
      scanf("%d", &a);
   
    dfs(1, n);
   
    return 0;
}

isdkz 发表于 2023-4-4 15:16:07

您的程序实现了暴力法对输入数组中的整数进行全排列,并按要求从小到大输出结果。

经过分析,我发现这个程序没有明显的逻辑错误。

但是,根据题目要求,您需要对输出结果进行排序。

您可以在输出结果之前对数组进行排序。以下是我为您修改后的代码:

#include <stdio.h>
#include <stdlib.h>

int a, used, num;
int result; // 9! = 362880
int result_index = 0;

void dfs(int step, int n)
{
    if (step == n + 1)
    {
      int temp = 0;
      for (int i = 1; i <= n; i++)
            temp = temp * 10 + num;
      result = temp;
      return;
    }

    for (int i = 1; i <= n; i++)
    {
      if (!used)
      {
            used = 1;
            num = a;
            dfs(step + 1, n);
            used = 0;
      }
    }
}

int compare(const void *a, const void *b)
{
    return (*(int *)a - *(int *)b);
}

int main()
{
    int n;
    scanf("%d", &n);

    for (int i = 1; i <= n; i++)
      scanf("%d", &a);

    dfs(1, n);

    qsort(result, result_index, sizeof(int), compare);

    for (int i = 0; i < result_index; i++)
      printf("%d ", result);

    return 0;
}

在这个修改后的版本中,我添加了一个数组result来存储所有可能的排列组合,并在dfs函数中将所有结果存储到数组中。

之后,我使用了qsort函数对结果数组进行排序,最后按照要求输出所有元素。
页: [1]
查看完整版本: 为什么提交后有一处错误