c - 打印此图案背后的逻辑

标签 c loops

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 ,因此它返回到最近的左边缘或右边缘的距离。

第三行选择前两行计算得出的较小值。

所有这些都类似于“距中心的距离”的原因是后续的 printfn 中减去计算值,其中n是表格宽度的一半...索引距边缘的最大距离是中心(即每个边缘之间的中间)。

所以现在你可以将算法的原始版本解读为做出相当任意的选择,从 i 中较小的一个开始。或j在第一行。然后接下来的两行与修订版的前两行做了同样的事情,但是你必须继承min的知识。是 ij .

考虑第一行:if min == i那么该行实际上与修订版本相同;但如果min == j ,那么情况(在修订版中)其中 i < len-i没有实际意义,如 j已经小于 i 的结果值。然而,len-i-1的情况小于 min/j仍在处理。

简而言之,原文更难理解,因为它迫使读者在心里进行逐案分析,并将所有结果牢记在心。修订后的版本计算简单的独立值,然后将它们组合成所需的结果。

关于c - 打印此图案背后的逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52020688/

相关文章:

c - 读取整个管道 - c

c - __attribute__((malloc)) 与限制

c - Linux 内核中的进入和退出打印

c++ - 在 c/c++ 中跟踪动态内存分配

用于双重工作的 Java 循环

postgresql - PostgreSQL 中基于游标的记录

c++ - 如何搜索 vector 元素并替换它?

c - C中的fread错误

c++ - 下一个更大的元素

python - 如何将多个列表值作为函数参数传递?