GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Diagonais python

programação
python
Tags: #<Tag:0x00007fa68d9ad428> #<Tag:0x00007fa68d9ad1a8>

#1

Pessoal, preciso de uma ajuda, denovo, dessa vez eu tenho uma Matriz MxN (definido pelo usuário), que eu preciso mostrar os valores de todas as diagonais, por exemplo:

Matriz:

8 3 2 5
0 1 9 1
2 7 1 0

Saída:

8
0 3
2 1 2
7 9 5
1 1
0
2
0 7
8 1 1
3 9 0
2 1
5

Alguma ideia que pode ajudar?

Detalhe: Não posso importar nenhum módulo para me ajudar nisso.


#2

O mais próximo que cheguei foi usando list comprehension, mas só pega de uma ponta a outra…

# cima-baixo, esquerda-direita
print([m[i][i] for i in range(0, len(m))], "\n") # 8 1 1

# cima-baixo, direita-esquerda
print([m[i][~i] for i in range(0, len(m))], "\n") # 5 9 7

# baixo-cima, esquerda-direita
print([m[~i][i] for i in range(0, len(m))], "\n") # 2 1 2

# baixo-cima, direita-esquerda
print([m[~i][~i] for i in range(0, len(m))], "\n") # 0 9 3

Tirei do final desse post

Talvez você vai ter que fazer algo nesse sentido + laços for ou while para atingir “os miolos” da matriz, boa sorte!


#3

Valeu, vou tentar e depois digo se eu consegui.


#4

Em se tratando de matrizes, você deve procurar por “propriedades observáveis”, as explicações são tediosas pois tem que ficar procurando por deduções e suposições em busca de padrões estes sim importantes.

Os esboço a seguir precisa de uma boa revisão, pois não considerei a explicação de fácil entendimento (itens de 1 a 5).

Fiz uma implementação em outra linguagem, pois não entendo python, entretanto, creio que seja compreensível, pois usa basicamente o for, mas … .

Obs.: variável++ é o equivalente a variável = variável + 1, em outra linguagem pois como dito, não entendo python

   public static void main(String[] args) {
        int[][] matriz = new int[3][4];
        int linhas = matriz.length, colunas = matriz[0].length, linhaAtual, colunaAtual;
        for (int diagonais = 0; diagonais < linhas + colunas - 1; diagonais++) {
            
            linhaAtual = diagonais < linhas ? diagonais : linhas - 1;
            colunaAtual = diagonais < linhas ? 0 : 1 + (diagonais - linhas);
            
            for (int percorrer = linhaAtual; percorrer >= 0; percorrer--) {
                if (colunaAtual > colunas - 1) {
                    break;
                }                
                System.out.print(percorrer + "" + colunaAtual++);
            }
            System.out.println("");
        }
    }

Saída em linha X coluna:

00
1001
201102
211203
2213
23

Não fiz as diagonais que iniciam pela base, mas ao meu ver é questão de procurar por propriedades/padrões, você pode manter a análise atual, ou poderia inverter a matriz, de forma que a última linha tomasse o lugar da primeira, a penúltima o lugar da segunda etc, mas é só uma exemplificação de que há mais de uma forma de resolver o mesmo problema.

Té+