Что за заявление, чтобы напечатать эту матрицу - PullRequest
0 голосов
/ 20 декабря 2018

Я передаю матрицу в качестве входных данных (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

Итак, как мне распечатать следующие кадры?

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Предполагая, что ваша матрица имеет размер 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).

0 голосов
/ 20 декабря 2018

для того, чтобы напечатать это все, НО внешний кадр, просто сделайте отрицание вашего текущего логического значения:

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

По закону Де Моргана это переводится в:

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)))

...