4 4 4 4 4 4 4
4 3 3 3 3 3 4
4 3 2 2 2 3 4
4 3 2 1 2 3 4
4 3 2 2 2 3 4
4 3 3 3 3 3 4
4 4 4 4 4 4 4
我们必须为上述模式编写一个程序
#include <stdio.h>
int main()
{
int n;
scanf("%d", &n);
int len = n*2 - 1;
for(int i=0;i<len;i++){
for(int j=0;j<len;j++){
int min = i < j ? i : j;
min = min < len-i ? min : len-i-1;
min = min < len-j-1 ? min : len-j-1;
printf("%d ", n-min);
}
printf("\n");
}
return 0;
}
这是打印上述模式的代码,我正在了解这些代码背后的主要逻辑是什么,我正在尝试调试和跟踪此代码。我需要帮助,尤其是在这些方面
int min = i < j ? i : j;
min = min < len-i ? min : len-i-1;
min = min < len-j-1 ? min : len-j-1;
最佳答案
以下是几乎相同的版本,更容易理解。 原始程序中的三行令人困惑的行已被注释掉,下面给出了三行替换行。
#include <stdio.h>
int main()
{
int n;
scanf("%d", &n);
int len = n*2 - 1;
for(int i=0;i<len;i++){
for(int j=0;j<len;j++){
// int min = i < j ? i : j;
// min = min < len-i ? min : len-i-1;
// min = min < len-j-1 ? min : len-j-1;
int min_dist_top_or_bottom = i < len-i ? i : len-i-1;
int min_dist_left_or_right = j < len-j ? j : len-j-1;
int min = min_dist_top_or_bottom < min_dist_left_or_right ? min_dist_top_or_bottom : min_dist_left_or_right;
printf("%d ", n-min);
}
printf("\n");
}
return 0;
}
在注释版本中,它执行相同的计算,但以一种奇怪的增量方式构建它。修订后的版本力求保持计算的独立性,直到必须将它们组合起来才能得出答案。了解了修改后的版本后,原来的版本就更容易拆开了。
在修订版本中,第一行计算当前行索引是否 i
靠近 table 的顶部或底部。基于此,它返回到最近边缘的距离。第二行非常相似,但适用于列索引 j
,因此它返回到最近的左边缘或右边缘的距离。
第三行选择前两行计算得出的较小值。
所有这些都类似于“距中心的距离”的原因是后续的 printf
从 n
中减去计算值,其中n
是表格宽度的一半...索引距边缘的最大距离是中心(即每个边缘之间的中间)。
所以现在你可以将算法的原始版本解读为做出相当任意的选择,从 i
中较小的一个开始。或j
在第一行。然后接下来的两行与修订版的前两行做了同样的事情,但是你必须继承min
的知识。是 i
或j
.
考虑第一行:if min == i
那么该行实际上与修订版本相同;但如果min == j
,那么情况(在修订版中)其中 i < len-i
没有实际意义,如 j
已经小于 i
的结果值。然而,len-i-1
的情况小于 min
/j
仍在处理。
简而言之,原文更难理解,因为它迫使读者在心里进行逐案分析,并将所有结果牢记在心。修订后的版本计算简单的独立值,然后将它们组合成所需的结果。
关于c - 打印此图案背后的逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52020688/