【问题标题】:logic behind printing this pattern打印此模式背后的逻辑
【发布时间】:2018-08-25 19:41:23
【问题描述】:
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;

【问题讨论】:

  • 离中心的距离!
  • 你了解三元运算符吗? n 是大小,i 和 j 是行和列。
  • 你是怎么观察到他想找到离中心的距离的?
  • 而且我非常了解三元运算符
  • 我认为这是一个很好的问题;看到有人试图理解它的答案令人耳目一新。很多时候,人们只是想获得一个解决方案而不关心它是如何工作的。

标签: c loops


【解决方案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 是更靠近表格的顶部还是底部。基于此,它返回到最近边缘的距离。第二行非常相似,但适用于列索引j,因此它返回最接近左边缘或右边缘的距离。

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

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

因此,现在您可以将算法的原始版本解读为在第一行以ij 中较小的一个开始。然后接下来的两行和修改版的前两行做同样的事情,但是你必须发扬min要么是i要么是j的知识。

考虑这些行中的第一行:如果min == i,那么该行实际上与修订版相同;但是如果min == j,那么i &lt; len-i 的情况(在修订版中)没有实际意义,因为j 已经小于i 的结果值。但是len-i-1 小于min/j 的情况仍然可以处理。

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

【讨论】:

    【解决方案2】:

    int min = i &lt; j ? i : j;如果这个陈述是真的,min=i否则min=j

    同样的逻辑适用于:

     min = min < len-i ? min : len-i-1;
     min = min < len-j-1 ? min : len-j-1;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多