我正在尝试使用标准字符串置换算法理解递归和回溯(swap --> permute --> swap)
因为我似乎无法理解它是如何回溯、交换字符和排列的,所以我尝试在每次递归 permute() 调用时插入 printfs,并增加缩进“级别”。无论如何,这是代码:
void permute(char arr[], int L, int R, int level)
{
int i = 0;
level = level+1;
if(L == R)
{
printf("%*s", level, "\t");
printf("printing : %s\n", arr);
}
else
{
for(i = L; i <= R; i++)
{
printf("%*s", level, "\t");
printf("swapping %c with %c\n", arr[L], arr[i]);
SWAP(&arr[L], &arr[i]);
permute(arr, L+1, R, level);
printf("%*s", level, "\t");
printf("swapping back %c with %c\n", arr[i], arr[L]);
SWAP(&arr[L], &arr[i]);
}
}
}
int main()
{
char str[] = "abc";
permute(str, 0, 2, 0);
return 0;
}
我想要的是 printf("%*s", level, "\t");
在我们进入更深的递归级别时放置递增的制表符。但这不起作用,我得到的文本 block 移动了一个选项卡。
swapping a with a
swapping b with b
printing : abc
swapping back b with b
swapping b with c
printing : acb
swapping back b with c
swapping back a with a
swapping a with b
swapping a with a
printing : bac
swapping back a with a
swapping a with c
printing : bca
swapping back a with c
swapping back a with b
swapping a with c
swapping b with b
printing : cba
swapping back b with b
swapping b with a
printing : cab
swapping back b with a
swapping back a with c
知道如何让 printf 插入 (level * '\t')
标签吗?
最佳答案
格式字符串中的 *
不是重复计数;它是最小字段宽度。如果 level
为 19,则 %*s
将打印 19 个字符,但字符串中只有一个制表符,因此它始终只打印一个制表符和 18 个空格。该字符串将右对齐(没有用于左对齐的 -
标志),因此将有 18 个空格和一个制表符。
#include <stdio.h>
int main(void)
{
int level = 19;
printf("[%*s]\n", level, "\t");
return 0;
}
您需要一串制表符,例如 "\t\t\t\t\t\t\t\t\t\t\t\t"
,它比最深的制表符长你会去的水平。或者您需要一个小函数来缩进适当数量的制表符:
static inline void indent(int n)
{
for (int i = 0; i < n; i++)
putchar('\t');
}
并在调用 printf()
之前调用它。
关于c - 在 printf 语句中插入 'n' 制表符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42044341/