Matriz de impresión en "zigzag"
Descripción del Título
Dada una matriz, imprima esta matriz en zigzag, como se muestra en el ejemplo.
Ingrese una descripción:
La entrada contiene varias líneas, la primera línea contiene dos números enteros n y m (1 ≤ n, m ≤ 200) (1 \ leq n, m \ leq 200)( 1≤n ,metro≤2 0 0 ) , que representa el número de filas y columnas de la matriz, las n filas siguientes, cada fila de m enteros, que representan la matrizmatriz (1 ≤ matriz [i] [j] ≤ 40000) matriz (1 \ leq matriz [i] [j] \ leq 40000)m a t r i x ( 1≤m a t r i x [ i ] [ j ]≤4 0 0 0 0 )。
Descripción de salida:
Salida una línea, que representa la matriz de salida "Zigzag".
Ejemplo 1
entrar
4 4
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
Salida
1 2 5 9 6 3 4 7 10 13 14 11 8 12 15 16
Observaciones:
Complejidad espacial adicional O (1) O (1)O ( 1 )。
responder:
Use dos puntos para mantener cada diagonal. El primer punto (tr, tc) comienza desde la esquina superior izquierda y se mueve hacia la derecha y hacia abajo; el segundo punto (dr, dc) comienza desde la esquina superior izquierda y baja y hacia Muévase hacia la derecha y genere los elementos conectados por dos puntos cada vez.
Código:
#include <cstdio>
using namespace std;
const int N = 200;
int n, m;
int a[N][N];
void print( int tr, int tc, int dr, int dc, bool &flag ) {
if ( flag ) {
while ( tr <= dr ) printf("%d ", a[tr++][tc--]);
} else {
while ( dr >= tr ) printf("%d ", a[dr--][dc++]);
}
}
int main(void) {
scanf("%d%d", &n, &m);
for ( int i = 0; i < n; ++i ) {
for ( int j = 0; j < m; ++j )
scanf("%d", a[i] + j);
}
int tr = 0, tc = 0;
int dr = 0, dc = 0;
bool flag = false;
while ( tr < n ) {
print( tr, tc, dr, dc, flag );
tr += ( tc == m - 1 );
tc += ( tc != m - 1 );
dc += ( dr == n - 1 );
dr += ( dr != n - 1 );
flag = !flag;
}
return 0;
}