【问题标题】:What's the if statement to print this matrix打印此矩阵的 if 语句是什么
【发布时间】:2018-12-20 13:46:41
【问题描述】:

我将一个矩阵作为输入(c++)传递,我想从矩阵外部打印出数字,即它的“空心方形元素”。我知道该怎么做,这就是 if 语句:if(i==0 || i==n || j==0 || j==n)。我想打印矩阵的下一帧,因为使用这个 if 语句可以打印矩阵的外框。我想打印所有接下来的帧。

我已经使用if(i==0 || i==n || j==0 || j==n) 对矩阵进行了外部处理,但正如我所说,它会打印矩阵的第一帧,我想打印接下来的帧。

例如,给定矩阵

1 2 3 4
4 3 2 1
5 6 7 8
8 7 6 5

应该打印出来:

3 2
6 7 

所以它是“第二”帧,它是矩阵的内部。第一帧应该是:

1 2 3 4
4     1
5     8
8 7 6 5

那么,如何打印下一帧?

【问题讨论】:

  • 将0 替换为1,将n 替换为n-1
  • 不行,我已经试过了。为此,它只显示 3 和 7 而不是 3、2、6、7
  • 嗯,你必须在 if 语句的每个部分添加 i>0 等以排除外环。但我确信有更好的方法来做到这一点

标签: c++ arrays matrix


【解决方案1】:

假设您的矩阵大小为n+1 x n+1,我认为以下条件适用于任何大小的方阵:

if(((i==1 || i==n-1) && (j>0 && j<n)) || ((i>0 && i<n) && (j==1 || j==n-1)))

一般情况下,第k帧可以按以下条件打印:

if(((i==k || i==n-k) && (j>=k && j<=n-k)) || ((i>=k && i<=n-k) && (j==k || j==n-k)))

对于 k=0,此条件简化为第一个 if(i==0||i==n||j==0||j==n)。

【讨论】:

    【解决方案2】:

    为了打印除了外框之外的所有内容,只需对当前布尔值进行否定:

    if(!(i==0 || i==n || j==0 || j==n))

    根据德摩根定律,这转化为:

    if( i != 0 &amp;&amp; i != n &amp;&amp; j != 0 &amp;&amp; j != n)

    如果您想遍历矩阵的不同帧,则需要 for 循环:

    for(int depth = 0; depth < mat.row()/2 < depth++) if(((i==depth || i==n-depth) && (j>depth-1 && j<n - depth )) || ((i>depth -1 && i<n - depth ) && (j==depth || j==n-depth)))

    【讨论】:

    • 除了外框我什么都不想要
    • @DmytroDadyka 请告诉我我怎么没有? “我想打印矩阵的下一帧”
    • 我该如何遍历这些帧?...这就是我要问的@Luisjomen2a
    • @PaulP1 您需要使用行数(或列数,因为您正在使用平方矩阵)。请记住,这仅适用于具有一对行数的矩阵:for(int depth = 0; depth &lt; mat.row()/2 &lt; depth++) if(((i==depth || i==n-depth) &amp;&amp; (j&gt;depth-1 &amp;&amp; j&lt;n - depth )) || ((i&gt;depth -1 &amp;&amp; i&lt;n - depth ) &amp;&amp; (j==depth || j==n-depth))) 有点乱但类似:我会将其添加到我的答案中
    • 如果我知道如何打印第k帧就可以了,我稍后会弄清楚如何按顺序打印所有帧。 @DmytroDadyka
    猜你喜欢
    • 2013-11-05
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    • 2017-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多