Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: xabi100 en 27 Diciembre 2020, 18:23 pm



Título: extraer submatrices
Publicado por: xabi100 en 27 Diciembre 2020, 18:23 pm
Hola, necesito hacer un programa en c que extraiga submatrices cuadradas (k*k) de una matriz dada (m*n), calculando la suma de los elementos de cada submatriz y devuelva la submatriz con la suma mayor.
 
he hecho un codigo pero no me da lo que esperaba. en este caso k=2.

Código
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. int suma(int m[2][2]);
  4.  
  5. void main(void){
  6.  int matriz[5][4]={{1,2,2,4},{3,9,4,5},{6,7,2,1},{4,4,3,1},{0,0,3,8}};
  7.  int submatriz[2][2];
  8.  int i,j,fila,columna,mayorsuma;
  9.  
  10.  fila=0;columna=0;
  11.  
  12.  
  13.  
  14.  
  15.  
  16.  mayorsuma=15;
  17.  for(i=0;i<5;i++){
  18.    for(j=0;j<4;j++){
  19.  
  20.      for(int k=i;k<i+2;k++){
  21.        for(int p=j;p<j+2;p++){
  22.  
  23.          submatriz[k][p]= matriz[k][p];
  24.  
  25.          if(suma(submatriz)> mayorsuma){
  26.            mayorsuma=suma(submatriz);
  27.            fila=k;
  28.            columna=p;}
  29.        }
  30.      }
  31.    }
  32.  }
  33.  
  34. printf ("mayorsuma   = %d \n",mayorsuma  );
  35. printf ("fila   = %d \n",fila  );
  36. printf ("columna   = %d \n",columna  );        
  37.  
  38.  
  39.  
  40.  
  41.  
  42. }
  43. int suma(int m[2][2]){
  44.   int i,j;
  45.   int sum=0;
  46.  
  47.   for(i=0;i<2;i++){
  48.     for(j=0;j<2;j++){
  49.       sum=sum+m[i][j];
  50.     }
  51.   }
  52. return (sum);
  53. }


Título: Re: extraer submatrices
Publicado por: K-YreX en 27 Diciembre 2020, 20:25 pm
Tienes varios errores:
  • Líneas 17 y 18 -> La i y la j marcan el punto de inicio. A cada valor de i y de j le vas a sumar hasta 2 por lo que en las últimas iteraciones de cada bucle se te saldrá fuera de la matriz.
  • Línea 23 -> No es la misma la posición que vas leyendo de la matriz original que la posición en la que tienes que escribir de la submatriz. Aunque hagas la submatriz que empieza por ejemplo en [2][3] tienes que empezar a escribir en
  • , no en [2][3].
  • Líneas 25 - 28 -> No tienes que calcular la suma cada vez que cambias un valor sino cada vez que copias una submatriz completa. Tal y como lo haces ahora mismo estás calculando sumas de submatrices que no existen.

Aparte de los errores, ese programa está muy limitado pues no permite cambiar fácilmente ni el tamaño ni los valores de las matrices. Sería mejor usar constantes para permitir esto más fácilmente.