【发布时间】:2016-04-04 05:06:56
【问题描述】:
我必须找到一组字母的组合,第一组中的第二个字母应该与第二组中的第一个字母相同,等等。
例如,该组的解决方案:AA, CB, AC, BA, BD, DB
这是:CB, BD, DB, BA, AA, AC
到目前为止,我有这段代码,它可以工作,但如果有很多组,计算需要很长时间。我需要让它更有效率。
在输入文件中,有这个输入
10
C D
B C
B B
B B
D B
B B
C A
A B
B D
D C
我的代码
#include <stdio.h>
#include <stdlib.h>
void permutation(char group[][2], int buffer, int sum) {
int i, j;
char temp;
if (buffer == sum && group[1][1] == group[sum][2]) {
for (i = 1; i < sum; i++)
if (group[i][2] != group[i+1][1]) break;
if (i == sum) {
FILE *output;
output = fopen("output.txt", "a");
for (j = 1; j <= sum; j++) {
fprintf(output, "%c %c\n", group[j][1], group[j][2]);
}
exit(1);
}
} else {
for (i = buffer; i <= sum; i++) {
temp = group[buffer][1];
group[buffer][1] = group[i][1];
group[i][1] = temp;
temp = group[buffer][2];
group[buffer][2] = group[i][2];
group[i][2] = temp;
permutation(group, buffer + 1, sum);
temp = group[buffer][1];
group[buffer][1] = group[i][1];
group[i][1] = temp;
temp = group[buffer][2];
group[buffer][2] = group[i][2];
group[i][2] = temp;
}
}
}
int main() {
FILE *input;
input = fopen("input.txt", "r");
int sum, i;
fscanf(input, "%d", &sum);
char group[sum][2];
for (i = 1; i <= sum; i++) {
fscanf(input, "%s", &group[i][1]);
fscanf(input, "%s", &group[i][2]);
}
permutation(group, 1, sum);
}
编辑所以我对我的程序进行了一些更改(感谢您的帮助,我对编程很陌生,所以我很抱歉出现错误),我不再使用排列,我'我只是寻找路径。它运作良好,但现在我的输入有 100000 个组,并且再次需要很多时间(大约 2 小时,我需要在 1 小时内完成)。我可能不得不再次以其他方式这样做xD有什么想法吗?
#include <stdio.h>
int find(char group[][2], int buffer, int sum, int path[]) {
int i, j;
for (i = 0; i < sum; i++) {
for (j = 0; j < buffer; j++)
if (path[j] == i)
break;
if (buffer == 0 ||
(group[path[buffer-1]][1] == group[i][0] && buffer == j)) {
printf("%d\n", buffer); // just for me to know what program is currently computing
path[buffer] = i;
find(group, buffer + 1, sum, path);
if (path[sum-1] != 0)
return;
}
}
}
int main() {
FILE *input = fopen("input.txt", "r");
if (input != NULL) {
int sum, i;
fscanf(input, "%d", &sum);
char group[sum][2];
int path[sum];
for (i = 0; i < sum; i++)
fscanf(input, " %c %c", &group[i][0], &group[i][1]);
for (i = 0; i < sum;i++)
path[i] = 0;
find(group, 0, sum, path);
FILE *output = fopen("output.txt", "a");
for (i = 0; i < sum; i++)
fprintf(output, "%c %c\n", group[path[i]][0], group[path[i]][1]);
} else
printf("Input file was not found.");
}
【问题讨论】:
-
请停止从答案和 cmets 建议中逐步编辑发布的代码,这会使整个讨论不一致。
-
我建议您共享所有必要的代码,以便可以运行程序并测试性能。您至少应该尽最大努力让我们更容易提供帮助。您的问题不是编码问题,而是性能问题;这是一个编码问答网站,而不是性能网站。完成测试需要多长时间?
-
这里你输入了 50 对:50 F C A F E E E C E F E B F F E E E E E E E E B F F F C F E A A E E E E E E E E B C A E C E C E E B C E E E E F E F E C A D E E E D A E B C C E E E E F A A C E E B D我认为它应该以其他方式编程,有人可以告诉我一些建议如何以其他方式编程吗?
-
你能发布一个指向这个大测试文件的链接吗?
标签: c combinations permutation letter