Diagonal secundaria de matriz.!

Iniciado por cuazzo, 21 Junio 2010, 03:32 AM

0 Miembros y 1 Visitante están viendo este tema.

cuazzo

Hola.. buscando ejercicios encontre uno que me dice imprimir la diagonal principal de una matriz, el cual me salio, hice lo siguiente:
m=int(raw_input("Ingrese el número de filas: "))
n=int(raw_input("Ingrese el número de columnas: "))


A=[]
for j in range(m):
  A.append([0]*n)
 
print "Lectura de la matriz A"
for j in range(m):
  for k in range(n):
    A[j][k] = float(raw_input("Dame el componente (%d,%d): " %(j+1,k+1)))
   
for i in A:
  print i


C=[]     
for k in range(m):
  for j in range(n):
    if k==j:
      C.append (A[j][k])
     
print  C


bien, ese salio, pero a la hora de querer imprimir la diagonal secundaria, no se que hacer, quiero encarar el ejercicio asi, empezando a recorrer la matriz de atrás para adelante o invirtiendo la matriz totalmente, pero no se me ocurre como hacerlo.

leogtz

Bueno, yo no sé python, pero para sacar la diagonal principal tienes que hacer esto:

Suponiendo que tengamos una matriz (cuadrada) así:

1 2 3
4 5 6
7 8 9


La matriz diagonal secundaria es:
3, 5, 7

Utiliza un bucle en donde inicialices la variable indice a "dimension - 1", dicha variable indice va a ir en decremento, fijate como vas yendo de la columna 2 a la 1 y luego a la 0, es por eso que en decremento, luego, inicializa una variable indice a 0, para que vaya recorriendo las filas, esta otra variable indice debe de ir en incremento:

3 <- A[0][2]
5 <- A[1][1]
7 <- A[2][0]

Guiate de esto:

for(i = dimension - 1, filas = 0; i >= 0; i--, filas++)
        printf("%d\n", matriz[filas][i]);
   
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

plof

Se nota que que has estado trabajando, lo que traes hoy tiene mejor pinta, estás preparado para la charla de la hormiguita. Imagina que una hormiguita recorre tu programa de arriba hacia abajo y por cada iteración del bucle da un pasito hacia delante.

En tu ejemplo de arriba:
Código ("python") [Seleccionar]

A=[]
for j in range(m):
    A.append([0]*n)

for j in range(m):
    for k in range(n):
        A[j][k] = float(raw_input("Dame el componente (%d,%d): " %(j+1,k+1)))


Código ("hormiguita") [Seleccionar]

j=0, j=1, j=2, ...la hormiguita da 3 pasos.

(j=0,k=0), (j=0,k=1), (j=0,k=2)
(j=1,k=0), (j=1,k=1), (j=1,k=2)
(j=2,k=0), (j=2,k=1), (j=2,k=2) ... la hormiguita da 9 pasos.

La hormiguita da un total de 12 pasos, (n*m)+m pasos.

Si incluyes la creación de cada fila del
array en el primer bucle anidado:
Código ("python") [Seleccionar]

A=[]
for j in range(m):
    A.append([0]*n)

    for k in range(n):
        A[j][k] = float(raw_input("Dame el componente (%d,%d): " %(j+1,k+1)))


Código ("hormiguita") [Seleccionar]

(j=0,k=0), (j=0,k=1), (j=0,k=2)
(j=1,k=0), (j=1,k=1), (j=1,k=2)
(j=2,k=0), (j=2,k=1), (j=2,k=2) ... la hormiguita da 9 pasos.

La hormiguita da un total de 9 pasos, n*m.
Si te cuento ésto es porque la calidad del código se mide entre otras muchas cosas por el menor número de pasos que da la hormiguita a lo largo de tu programa.

Volviendo con la diagonal, fijate bien como la solución que propone Leo es sin duda mejor que el recorrido que propones tú para recorrer la diagonal del array, ademas que la idea de la diagonal es solo para 'matrices cuadradas' (n=m), cosa que tampoco compruebas.

Solución 1 (la hormiguita de m pasos)
Código ("python") [Seleccionar]

if n == m:
    for k in range(m):
        C.append (A[k][k])


Solución 2 (la hormiguita de m*n pasos y está bastante mosqueada)
Código ("python") [Seleccionar]

if n == m:
    for k in range(m):
for j in range(n):
    if k==j:
C.append (A[j][k])


Para la diagonal en el otro sentido Leo lo ha dejado más que resuelto, procura hacer lo mismo para la próxima vez, es decir, lo primero es entender lo que uno quiere hacer y luego ya se llevará a la práctica, primero diseñar y luego programar.

Siguiendo con el ejemplo de Leo...
Código ("papel y lapiz") [Seleccionar]

La diagonal: (0,2) (1,1) (2,0)... la hormiguita DEBE dar 3 pasos, n o m (matriz cuadrada).
m = 3
n = 3 = 3

Bucle 0-2
k = 0
k = 1
k = 2

eureka!!
(0,2) (1,1) (2,0)
(k,2) (k,1) (k,0)

uhmmm...pero faltan las columnas...a ver...
k=0....necesito un 2
k=1....necesito un 1
k=2....necesito un 0

Si además sabemos que n y m valen siempre 3 en todo el recorrido, ¿se te ocurre algo?

Saludos.

pd.¿python en la sección de scripting? ¿en un foro de hacking?, si es porque no hay muchos posts lo podría apadrinar C/C++ , seguro que se llevan bien ;).

Novlucker

#3
Solución 1, la hormiguita puede elegir otras formas y conocer nuevos mundos, es que la hormiguita puede elegir entre cuadrados o rectángulos :P , pero luego de la solución esta algo mosqueada, porque resulta que ahora ya no puede caminar tanto como antes :P

Citarpd.¿python en la sección de scripting? ¿en un foro de hacking?, si es porque no hay muchos posts lo podría apadrinar C/C++ , seguro que se llevan bien.

Claro, si python es scripting ... y en un foro de seguridad

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

cbug

Esta puede ser una solución:

Código (python) [Seleccionar]
##Imprimo la diagonal secundaria
C = []
i = 0
j = 0
for i in range(n):
    for j in range(m):
        if(i + j == n - 1):
            C.append(matriz[i][j])
print(C)

plof

Cita de: Novlucker en 21 Junio 2010, 14:31 PM
Solución 1, la hormiguita puede elegir otras formas y conocer nuevos mundos ...
Teología de la hormiguita le llaman  :P.
Cita de: Novlucker en 21 Junio 2010, 14:31 PM
Claro, si python es scripting ...
Estoy de acuerdo, solo creo que python aspira mucho más que sus compañeros de grupo  :rolleyes:.
Cita de: Novlucker en 21 Junio 2010, 14:31 PM
...y en un foro de seguridad
Sin embargo se trabaja más con overflows que con netfilter... no se Novlucker,  no lo entiendo, me parece perfecto la imagen que quereis transmitir en el foro pero no doy con la fórmula de dónde y cómo se debe decir cada cosa.
La verdad es que prefiero no tocar el más tema, por mi parte evito las palabras clave y seguimos con arrays y el buen rollo que trae esta sección.

Cita de: cbug en 21 Junio 2010, 17:01 PM
Esta puede ser una solución:

Código (python) [Seleccionar]
##Imprimo la diagonal secundaria
C = []
i = 0
j = 0
for i in range(n):
    for j in range(m):
        if(i + j == n - 1):
            C.append(matriz[i][j])
print(C)

No necesitas iterar a lo largo de todo el array, la diagonal es única solamente para matrices cuadradas y éso nos da algo de ventaja.
Código ("Python") [Seleccionar]

if n==m:
    for i in range(n):
        C.append(A[i][m-i-1])


...o en versión 'package', igual de válida que la anterior:
Código ("Python") [Seleccionar]

n==m and [C.append(A[i][m-i-1]) for i in range(n)


Saludos.

cuazzo

Hola de nuevo.! muchas muchas gracias por contestar!, son unos genios, anoche me quede hasta tarde y lo logre hacer, eso si, no tuve en cuenta la cantidad de pasos que hace la hormiguita, jaja, pero salio.!, de ahora en mas tmb voy a tratar que mis programas sean lo mas rapido posibles, les dejo el codigo para que me digan que tal:
D=[]     
if m==n:
for k in range(m):
   for j in range(n):
     if k+j==len(A)-1 :
       D.append (A[j][k])
       print  D
else:
  print "La Matriz no es cuadrada"


Muchas muchas gracias.!