暴力比较n个数,输出程序
考虑n = 3的情况,相应的3个变量为a, b, c。在结果集里加入a作为初始化,之后b可以在a前面或后面2种位置可以插入,分别代表b < a或b > a的情况。这样就可以生成第1级的if-else语句,并递归调用至2级。对于"ba"顺序的结果集,c有三种位置可以插入,对应的语句应该是:
if c < b then
...
else if c < a then
...
else
...
- s字符串储存我们已经放置的字符。初始递归调用 d=1,表示我们将在s字符串的第1个位置上放置字符。
- 若递归发现 d 等于 n,表示我们已经放置了n个字符,将其输出并返回即可。
- 若 d 不等于 n,则我们有 d+1 个位置可以插入字符串,插入前记得保存当前的s,在递归返回后恢复s字符串。
- 依次枚举这 d+1 个位置,并将其插入,然后调用递归函数
#include <stdio.h>
#include <string.h>
int n, l;
char s[10] = "a";
void search(int d) {
int i, j;
if (d == n) {
for (i=0 ; i<d ; i++)
putchar('\t');
printf("writeln(%c", s[0]);
for (i=1 ; i<n ; i++)
printf(", %c", s[i]);
printf(")\n");
return;
}
char backup[10];
memcpy(backup, s, sizeof(s));
for (i=0 ; i<=d ; i++) {
for (j=0 ; j<d ; j++)
putchar('\t');
if (i == d) {
s[d] = 'a' + d;
printf("else\n");
search(d+1);
}
else {
for (j=d-1 ; j>=i ; j--)
s[j+1] = s[j];
s[i] = 'a' + d;
if (i == 0)
printf("if");
else
printf("else if");
printf(" %c < %c then\n", s[i], s[i+1]);
search(d+1);
memcpy(s, backup, sizeof(s));
}
}
}
int main() {
scanf("%d", &l);
while (l--) {
scanf("%d", &n);
printf("program sort(input, output);\nvar\na");
int i;
for (i=1 ; i<n ; i++)
printf(", %c", 'a'+i);
printf(" : integer;\nbegin\n\treadln(a");
for (i=1 ; i<n ; i++)
printf(", %c", 'a'+i);
printf(");\n");
search(1);
printf("end.\n");
if (l)
putchar('\n');
}
}