|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
给定一个含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[10], used[10], num[10];
void dfs(int step, int n)
{
if (step == n + 1)
{
for (int i = 1; i <= n; i++)
printf("%d", num[i]);
printf(" ");
return;
}
for (int i = 1; i <= n; i++)
{
if (!used[i])
{
used[i] = 1;
num[step] = a[i];
dfs(step + 1, n);
used[i] = 0;
}
}
}
int main()
{
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
dfs(1, n);
return 0;
}
您的程序实现了暴力法对输入数组中的整数进行全排列,并按要求从小到大输出结果。
经过分析,我发现这个程序没有明显的逻辑错误。
但是,根据题目要求,您需要对输出结果进行排序。
您可以在输出结果之前对数组进行排序。以下是我为您修改后的代码:
#include <stdio.h>
#include <stdlib.h>
int a[10], used[10], num[10];
int result[362880]; // 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[i];
result[result_index++] = temp;
return;
}
for (int i = 1; i <= n; i++)
{
if (!used[i])
{
used[i] = 1;
num[step] = a[i];
dfs(step + 1, n);
used[i] = 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[i]);
dfs(1, n);
qsort(result, result_index, sizeof(int), compare);
for (int i = 0; i < result_index; i++)
printf("%d ", result[i]);
return 0;
}
在这个修改后的版本中,我添加了一个数组result来存储所有可能的排列组合,并在dfs函数中将所有结果存储到数组中。
之后,我使用了qsort函数对结果数组进行排序,最后按照要求输出所有元素。
|
|