我想打印任意3个字母的组合而不使用C编程中的嵌套for循环?
以下是3个字母“ABC”组合的代码。 我可以使用3 for循环执行程序。 但我不想那样。我想通过一个for循环和非递归的方式来做它。但我没有得到任何逻辑。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i=0,j=0;
char b[10],a[] = "ABC";
strcpy(b,a);
while(i < 3)
{
b[j]=a[i];
if(i==0)
{
b[j+1]=a[i+1];
b[j+2]=a[i+2];
printf("\n%s",b);
b[j+1]=a[i+2];
b[j+2]=a[i+1];
printf("\n%s",b);
}else if(i==1)
{
b[j+1]=a[i+1];
b[j+2]=a[i-1];
printf("\n%s",b);
b[j+1]=a[i-1];
b[j+2]=a[i+1];
printf("\n%s",b);
}else
{
b[j+1]=a[i-1];
b[j+2]=a[i-2];
printf("\n%s",b);
b[j+1]=a[i-2];
b[j+2]=a[i-1];
printf("\n%s",b);
}
i++;
}
getch();
return 0;
}
答案 0 :(得分:1)
如果您知道它总是长度为3,您可以使用预生成来最小化复杂性和/或代码。预生成是将复杂计算从运行时间移动到编译时甚至是之前的行为,对于复杂的计算来说,它可以非常高效。
一个例子(虽然有点人为)是编写一个程序来计算所有可能的无符号64位阶乘(其中只有大约九十个)然后让该程序生成源代码(查找表和函数)可以执行查找以获取它们。在编译将使用它的程序之前,生成表的复杂性是一次。
这意味着程序中使用它的因子操作 从可能耗时的一系列乘法变为更类似于一次乘法和加法(表查找)。 / p>
将相同的方法应用于排列(虽然查找表的生成是在我脑海中完成的,因为它并不复杂)会给你这样的代码:
#include <stdio.h>
// The permutations.
static int perm3[] = { 0,1,2, 0,2,1,
1,0,2, 1,2,0,
2,0,1, 2,1,0 };
int main (void) {
int i;
char x[] = {'a', 'b', 'c'};
// Permute using the table to get indexes.
for (i = 0; i < sizeof(perm3) / sizeof(perm3[0]); i += 3)
printf ("%c %c %c\n", x[perm3[i]], x[perm3[i+1]], x[perm3[i+2]]);
return 0;
}
现在,有些人可能会认为&#34;作弊&#34;但我在这里说实话,你能写的一些最快的程序会以这种方式作弊: - )
答案 1 :(得分:0)
您要问的问题是基于算法概念Backtracking
这是函数
void permute(char *a, int i, int n)
{
int j;
if (i == n)
printf("%s\n", a);
else
{
for (j = i; j <= n; j++)
{
swap((a+i), (a+j));
permute(a, i+1, n);
swap((a+i), (a+j)); //backtrack
}
}
}
从main()
int main()
{
char a[] = "ABC";
permute(a, 0, 2); // first param is array,2nd is starting index and 3rd is ending index
return 0;
}
Wolfram alpha在这类问题背后有数学概念。基本上我们逐个尝试所有解决方案,然后通过将这些更改恢复为原始解决方案来回溯,然后再次尝试不同的解决方案。要清楚地了解这一点。 http://mathworld.wolfram.com/Permutation.html