Как пройти 2D массив в зигзагообразном порядке

У нас есть int 2D массив следующим образом:

int matrix[4][4] =
{{1,2,3,4}
{5,6,7,8}
{9,10,11,12}
{13,14,15,16}};

По соглашению, если мы хотим распечатать массив по порядку, мы можем:

    for (int x=0; x<4; x++)
{
for (int y=0; y<4; y++)
{
cout << matrix[x][y] << "  ";
}
cout << endl;
}

Выход:

 1  2  3  4
5  6  7  8
9 10 11 12
13 14 15 16

Мой вопрос: Как мы можем пройти 2D-массив в зигзагообразном порядке. Например, выведите значения массива так:

 1  2  3  4
8  7  6  5
9 10 11 12
16 15 14 13

2

Решение

Как насчет

bool r=false;
for (int x=0; x<4; x++)
{
for (int y=0; y<4; y++)
{
cout << matrix[x][r ? 3-y : y] << "  ";
}
cout << endl;
r = !r;
}
3

Другие решения

Вот решение (до того, как вы отредактировали исходный вопрос, вы запросили решение исходной проблемы без использования if () или условных выражений):

#include <iostream>
using namespace std;
int main()
{
int matrix[4][4] =
{{1,2,3,4},
{5,6,7,8},
{9,10,11,12},
{13,14,15,16}};

bool backwards = false;
int incre = 1;
for (int x=0; x < 4; x++)
{
int index = 3 * backwards;
for (int y=0; y<4; y++, index += incre)
cout << matrix[x][index] << "  ";
incre = -incre;
backwards = !backwards;
cout << endl;
}
}

Хитрость заключается в том, что вы хотите, чтобы количество столбцов увеличивалось на одну строку, уменьшалось на следующую и т. Д. Именно поэтому переменная увеличивается.

«Назад» — это просто логическое значение, которое говорит нам, идем ли мы назад или вперед, таким образом устанавливая правильный индекс для начала.

1

Вот решение с одним for-loop.

#include <iostream>
using namespace std;

int matrix[][4] = { { 0,1,2,3}, {4,5,6,7}, {8,9,10,11}, {12,13,14,15}};

int main() {
for (int x=0; x<16; x++) {
cout << matrix[x/4][ x%4 * ((x/4+1)&1) + (3-x%4)*((x/4)&1) ] << "  ";
if (x%4==3) cout << endl;
}
return 0;
}

Первый [] просто дает вам строку, разделив на 4 -> i/4,
Второй [] дает столбец в 2 шага. Требуется напоминание после деления на 4 -> x%4 и умножает на 1, если это четная строка -> (x/4+1)&1 затем добавляет напоминание в обратном порядке -> 3-x%4 умножить на 1, если это нечетная строка -> (x/4)&1

0

Гораздо более простой и понятный подход

#include <iostream>
using namespace std;
int main() {
// your code goes here
int matrix[4][4] = { { 0,1,2,3}, {4,5,6,7}, {8,9,10,11}, {12,13,14,15}};
bool forward = true;
int j;
for(int i = 0,k=0;i<4;i++)
{
if(forward)
{
for(j=0;j<4;j++)
{
cout<<matrix[i][j]<<" ";
}
cout<<endl;
forward = false;
}
else
{
for(j=3;j>=0;j--)
{
cout<<matrix[i][j]<<" ";
}
cout<<endl;
forward = true;
}
}
return 0;
}
0
По вопросам рекламы [email protected]