Moverse por las paralelas a la diagonal secundaria de una matriz.

Iniciado por AlucardDracula, 17 Diciembre 2013, 17:45 PM

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

AlucardDracula

Intento hacer un programa que resuelva este problema:

http://gyazo.com/971bdf866b6e4882b58503499a8b1376.png


Se que para que un elemento este en la diagonal k (k>= 0 y k < size de la matriz) se tiene que cumplir que f(fila) + c(columna) = k.

Pero me estoy haciendo un lio enorme para poder moverme por la matriz y como tengo que especificar las variables de los whiles/fors que necesito  :huh:

¿Alguna idea de como implementar los fors o whiles? Gracias

Almapa

Parece un problema interesante, tienes algo hecho ya? Así no partimos de 0 y además creo que la tarea es tuya no nuestra. ;)

Un saludo

Almapa

Bueno, como me parecía interesante y no tenía mucho que hacer, aquí tienes mi versión:


Código (cpp) [Seleccionar]
#include <iostream>
using namespace std;
int main() {
   int d,c,i,j;
   cout<<"Longitud de la matriz: ";
   cin>>d;
   int matriz[d][d];
   for(int k=0;k<(2*d-1);k++){
           cout<<"Constante de la diagonal "<<k<<": ";
           cin>>c;
           if(k<d){
                   i=0;
                   j=k;
                   if(i==j){
                             matriz[i][j]=c;
                   }else{
                         matriz[i][j]=c;
                         while(i!=k){
                                     i++;
                                     j--;
                                     matriz[i][j]=c;
                         }
                   }
           }else{
                 i=k-(d-1);
                 j=d-1;
                 if(i==j){
                             matriz[i][j]=c;
                 }else{
                       matriz[i][j]=c;
                       while(i!=d-1){
                                   i++;
                                   j--;
                                   matriz[i][j]=c;
                       }
                 }
           }        
   }
   cout<<endl<<endl<<"Matriz inicial"<<endl;
for(int k=0;k<d;k++){
       for(int l=0;l<d;l++){
               
               cout<<matriz[k][l];
       }
       cout<<endl;
}
int f;
while(1){
        cout<<endl<<endl<<"Magnitud de la fuerza a aplicar: ";
        cin>>f;
        for(int k=0;k<(2*d-1);k++){
                if(k<d){
                        c=(f+matriz[0][k])-(f+matriz[0][k])/2;
                        f=(f+matriz[0][k])/2;
                        i=0;
                        j=k;
                        if(i==j){
                             matriz[i][j]=c;
                        }else{
                             matriz[i][j]=c;
                             while(i!=k){
                                     i++;
                                     j--;
                                     matriz[i][j]=c;
                             }
                        }
                       
                }else{
                      c=(f+matriz[k-(d-1)][d-1])-(f+matriz[k-(d-1)][d-1])/2;
                      f=(f+matriz[k-(d-1)][d-1])/2;
                      i=k-(d-1);
                      j=d-1;
                      if(i==j){
                             matriz[i][j]=c;
                      }else{
                            matriz[i][j]=c;
                            while(i!=d-1){
                                   i++;
                                   j--;
                                   matriz[i][j]=c;
                            }
                      }
                 }  
        }
        cout<<endl<<"Matriz resultante"<<endl<<endl;
        for(int k=0;k<d;k++){
                for(int l=0;l<d;l++){
                        cout<<matriz[k][l];
                }
                cout<<endl;
        }
       
}
return 0;
}

AlucardDracula

Cita de: Almapa en 17 Diciembre 2013, 20:57 PM
Parece un problema interesante, tienes algo hecho ya? Así no partimos de 0 y además creo que la tarea es tuya no nuestra. ;)

Un saludo

De momento tengo esto, pero esta inacabado porque llegado a un punto me lie demasiado xD

Lo que tenia en mente era algo como esto para una matriz 3x3 que tiene 5 diagonales (las secundarias).
k = 0;
(0,0)
--------
k = 1;
(0,1)
(1,0)
-------
k=2;
(0,2)
(1,1)
(2,0)
---
k=3;
(1,2)
(2,1)
----
k = 4;
(2,2)


O sea vi que el patrón era que ibas sumándole 1 al numero de filas y restándole al de columnas hasta que en el de columnas llegabas al limite entonces ese lo dejabas fijos en el primer caso y sumabas uno al nº de filas y luego seguías normalmente sumando y restando filas y columnas respectivamente como en el ejemplo.
Y que siempre cumpla que f+c = k.

Uno de los problemas que tenia era que no sabia exactamente donde podría poner la variable f para modificarla.

Aqui lo que tengo, se que esta mal pero vamos aprendiendo  :P

#include <iostream>
#include <vector>
using namespace std;

typedef vector< vector<int> > Ocea;

void llegir_matriu(Ocea& a) {
    int mida = a.size();
    for (int i = 0; i < mida; ++i) {
        for (int j = 0; j < mida; ++j) cin >> a[i][j];
    }
}

void propaga(Ocea& oc, int f) {
    int mida = oc.size();
    int k = 0;
    while (k < mida) {
        int i, j, ai, aj;
        i = j = ai = aj = 0;
        while (i < mida) {
            if (ai+aj == k) {
                oc[ai][aj] = (oc[ai][aj] + f) - (oc[ai][aj]+f)/2;
                if (ai < mida and aj > 0) {
                    ++ai;
                    --aj;
                }
                else {
                    ai = i;
                    aj = j;
                    if (j == mida-1) ++i;
                    else ++j;
                }
            }
        }
        f = (f+oc[ai][aj])/2;
        ++k;
    }
}

void escriu(const Ocea& mines) {
    int mida = mines.size();
    for (int i = 0; i < mida; ++i) {
        cout << mines[i][0];
        for (int j = 1; j < mida; ++j) {
            cout << " " << mines[i][j];
        }
        cout << endl;
    }
}

int main() {
    int m;
    cin >> m;

    for (int k = 0; k < m; ++k) {
        int f, n;
        cin >> f >> n;
        Ocea burra(n, vector<int>(n));
        llegir_matriu(burra);
        propaga(burra, f);
        escriu(burra);
        cout << endl;

    }
}

AlucardDracula

Muchas gracias Almapa  ;-) Ya he entendido como tenían que ir las condiciones  :P