Fortuna izquierdo-derecho base título class3- 8 de la matriz de impresión en zigzag C ++ se dan cuenta
1. Tema
Dada una matriz de la matriz, de manera esta matriz de impresión zigzag de acuerdo con "el", por ejemplo: 1,234,567,891,011,121,314 15 16 "El" número impreso zigzag es: 1,259,634,710,131,411,812 15 16
[reclamación] complejidad espacio adicional es O (1).
2. Análisis
El título de la forma de matriz de salida, se puede dividir de acuerdo a la dirección de la parte inferior izquierda a la parte superior derecha a las direcciones inferior izquierda y superior derecha dos salidas, la salida puede de hecho ser visto oblicuamente, la dirección del cambio se puede utilizar como variable específica bool. Considere establecer A, B como dos puntos auxiliares, el a principio, B son dos puntos (0,0) de posición de la parte superior izquierda posición de la esquina (0,0).
(1) es una conexión digital entre la salida requerida de AB, salidas los redondos se mueve hacia abajo a la A la derecha, B;
(2) el uso de una variable bool representa la dirección de la impresión, la impresión tomada después de cada ronda de inversa;
(3 ) cuando a es hacia abajo a la extrema derecha, B se mueve hacia el extremo más inferior de la derecha, hasta el final un movimiento a la parte inferior derecha, la salida sigue a la fig.
código 3. núcleo
Update (1) A, B el punto
aC, BC representa una columna, Ar, Ar significa una fila, cuando se trasladó a la aR extremo más inferior. Cuatro variables de código actualizadas se pueden cambiar para utilizar EXP1 exe2 :? EXP3 puede ser más concisa.
while(aR!=height)
{
print(arr,dir,aR,aC,bR,bC);
if(aC < width - 1)
{
aC++;
}
else
{
aR++;
}
if(bR < height - 1)
{
bR++;
}
else
{
bC++;
}
dir = !dir;
}
Número entre (2) Imprimir A, B
Imprimir A, B entre la impresión digital real es A, B números de la conexión cada vez que cambie una fila y números de las columnas pueden ser. Oblicua de izquierda a derecha para imprimir, y B, una reserva la línea, para añadir una fila para seguir imprimiendo hasta que encuentra A. De derecha a izquierda oblicua de impresión, y A, para añadir una fila, una columna para reducir, a continuación, la impresión continúa hasta que se encuentra con una B. La idea inicial es utilizar una posición de grabación variable intermedia y, a continuación, cambiar las variables intermedias para encontrar el siguiente punto hasta la finalización de la impresión, la impresión y no cambiaría las A, B, coordenadas. Entonces creo que esto se puede envasar como parte de una función, la ventaja no se cambia el parámetro argumentos, el cambio directo A, B coordenadas para la impresión sino que también elimina las variables redundantes.
void print(int arr[][width],bool dir,int aR,int aC,int bR,int bC)
{
if(dir)
{
while(bR >= aR)
{
cout<<arr[bR--][bC++]<<" ";
}
}
else
{
while(aR <= bR)
{
cout<<arr[aR++][aC--]<<" ";
}
}
}
4. El código completo
#include<iostream>
#define height 4
#define width 4
using namespace std;
void print(int arr[][width],bool dir,int aR,int aC,int bR,int bC)
{
if(dir)
{
while(bR >= aR)
{
cout<<arr[bR--][bC++]<<" ";
}
}
else
{
while(aR <= bR)
{
cout<<arr[aR++][aC--]<<" ";
}
}
}
int main()
{
//int arr[height][width] = {1,2,3,4,5,6,7,8,9};
int arr[height][width] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
int aR = 0,aC = 0,bR = 0,bC = 0;
bool dir = true;
while(aR!=height)
{
print(arr,dir,aR,aC,bR,bC);
if(aC < width - 1)
{
aC++;
}
else
{
aR++;
}
if(bR < height - 1)
{
bR++;
}
else
{
bC++;
}
dir = !dir;
}
system("pause");
return 0;
}