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
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
Bueno, como me parecía interesante y no tenía mucho que hacer, aquí tienes mi versión:
#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;
}
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;
}
}
Muchas gracias Almapa ;-) Ya he entendido como tenían que ir las condiciones :P