Извините всех, кто написал "Вторая половина должна быть похожа" ... это не так.
В любом случае, вот, пожалуйста:
// traverse array diagonally
int c, tmp, x;
for (c = N - 1; c > -N; c--) {
tmp = N - abs(c) - 1;
x = tmp;
while (x >= 0) {
if (c >= 0) {
std::cout << arr[x][tmp - x] << ", ";
}
else {
std::cout << arr[N - (tmp - x) - 1][(N-1)-x] << ", ";
}
--x;
}
std::cout << "\n";
}
Вам нужно это для игрыили что-то?
[править] Смотря на это снова, я думаю, что мой ответ был не очень хорошо написан.Вот краткий обзор:
Давайте представим, что N равно 3.
Нам нужна итерация по комбинациям координат, которая выглядит следующим образом:
(0, 0)
(1, 0), (0, 1)
(2, 0), (1, 1), (0, 2)
(2, 1), (1, 2)
(2, 2)
ИтакСначала некоторые заполнители:
int c, // a counter, set by the outer loop
tmp, // for intermediate results
x; // the x-index into *arr* (*y* will be defined implicitly)
Теперь этот внешний цикл
for (c = N - 1; c > -N; c--) {
делает c итерации по {2, 1, 0, -1, 2} .
Следующий шаг
tmp = N - abs(c) - 1;
x = tmp;
превращает {2, 1, 0, -1, -2} в {0, 1, 2, 1, 0} , которые являются длинами необходимых выходов на этом шаге минус один (поэтому они могут использоваться в качестве индексов).Мы делаем две копии этого, tmp и x .
Теперь мы отсчитываем от x до 0 :
while (x >= 0) {
...
--x;
}
, если мы находимся в верхней левой половине обр. , обозначается c> = 0 , x-индексы в обр. нужно начинать с диагонали и опускаться до нуля (от 0 до 0, от 1 до 0 и от 2 до 0) , тогда как y-индексы должны начинаться с нуля и подниматься до диагонали (от 0 до 0, от 0 до 1 и от 0 до 2) :
if (c >= 0) {
std::cout << arr[x][tmp - x] << ", ";
}
как только мы окажемся в нижней правой половине, x-индексы должны начинаться с N и до диагонали (от 2 до 1 и от 2 до 2) , тогда как y-индексы должны начинаться с диагонали и доходить до N (от 1 до 2)и 2 к 2) :
else {
std::cout << arr[N - (tmp - x) - 1][(N-1)-x] << ", ";
}
наконец, нам просто нужен разрыв строки в конце каждой строки:
std::cout << "\n";
Savy?: -)