我正在传递一个矩阵作为输入(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 :(得分:5)
假设您的矩阵的大小为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)
。
答案 1 :(得分:1)
为了打印所有东西,但外框,只需对当前的布尔值求反即可:
if(!(i==0 || i==n || j==0 || j==n))
根据De Morgan的定律,它转换为:
if( i != 0 && i != n && j != 0 && 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)))