[ Foro de C ]

Ayuda con la resolucion de un problema.

12-May-2016 21:37
Alejandro Enrique Tellez Lopez
4 Respuestas

El problema en resumen se detalla de la siguiente manera y condiciones:
Biologos han diseñado un experimento para desidir si una colonia de microbios es capaz de resolver problemas cuando se les estimula de maneras especificas. Se contruye un recipiente con la forma de una cuadricula rectangular y a cada cuadrito se le coloca cierta cantidad de quimico que le es muy despreciable a los microbios. El recipiente esta inclinado de manera en que los microbios solo pueden avanzar hacia abajo y a la derecha. Los microbios comienzan en la coordenada (1,1).
Se desea saber la cantidad c de compuesto quimico de debera soportar la colonia en su trayecto hasta la coordenada (m,n). Y la ruta que toma de manera que si van hacia abajo es 0 e ir hacia la derecha representa un 1.

Condiciones:
2<=m<=100
2<=n<=100
1<=c<=9

Los microbios avanzan por el camino donde haya menos químico.
Obviamente los microbios no pueden salirse de la cuadricula
Ejemplo de entrada:
3 4
3 1 4 1
5 9 2 6
1 2 3 4

Salida:
17
11001

MI intento de codigo. Por alguna razon que no logro encontrar se corre infinitamente :( A de ser algun error logico mio

 
// Experimento Microbios
#include<stdio.h>
int main ()
{
    int m,n,i,j;
 
    printf("Ingrese La cantidad de filas m: ");
    scanf("%d",&m);
    printf("\nIngrese la cantidad de columnas n: ");
    scanf("%d",&n);
 
    int c[m][n];
 
    printf("\nIngrese unidades de C de la matriz: ");
 
 
    for(i=1;i<=m;i++){
        for(j=1;j<=n;j++){
            scanf("%d",&c[i][j]);
            }
    }
 
    int a=1;
    int b=1;
    int z=0;
    int ruta[m+n-2];
    int suma=0;
 
    while((a!=m)||(b!=n)){
 
    	printf("hi");
       if(a==m){
       b++;
       suma+=c[a][b];
       z++;
       ruta[z]=0;
       }
       else{
            if(b==n){
            a++;
            suma+=c[a][b];
            z++;
            ruta[z]=1;
            }
            else{
                 if(c[++a][b]>c[a][++b]){
                 b++;
                 suma+=c[a][b];
                 z++;
                 ruta[z]=1;
                 }
                 else{
                 a++;
                 suma+=c[a][b];
                 z++;
                 ruta[z]=0;
                 }
            }
       }
    }
    printf("Cantidad Minima de Quimico C = %d", suma);
 
    printf("Ruta: \n");
    for(i=1;i=z;i++){
    printf("%d ",ruta[i]);
    }
 
 
 
    getch();
    return 0;
 
}
 


 


20-May-2016 23:52
Nacho Cabanes (+31)

En un primer vistazo rápido:

- La lógica de alguna orden como "if(c[++a][b]>c[a][++b])" es confusa y propensa a errores.

- Este "for" tiene en su parte central una asignación, no una comparación, lo que suena a error: "for(i=1;i=z;i++)"

- Si declaras un array como "int c[m][n];", sus índices van de 0 a m-1 y de 0 a n-1. Por eso, este "for" está dejando unas posiciones de la matriz vacía y en otras ocasiones está escribiendo fuera de ella:

   for(i=1;i<=m;i++){
       for(j=1;j<=n;j++){
           scanf("%d",&c[i][j]);
           }
   }

- Con nombres de variables tan cortos y sin comentarios es difícil entender lo que pretende hacer tu programa. Por eso, yo te recomendaría añadir tas "printf("hi");" otro "printf" que te muestre los valores de las variables a, b, m, n  (al menos).


23-May-2016 21:05
Alejandro Enrique Tellez Lopez

Gracias por tus Comentarios Nacho :)


24-May-2016 23:21
Alejandro Enrique Tellez Lopez

Nacho, tengo un problema  como hago para para comparar las siguientes coordenadas de una matriz, en este caso la de la derecha y la de abajo, cada cuadro de la matriz tiene un valor, si se empieza de la o coordenada (0,0) compara cual es el menor entre las coordenadas (0,1) y (1,0)... y asi. No encuentro alguna forma, podrias ayudarme con alguna ideita porfa.. Por cierto, este problema es catalogado para principiantes en el concurso de LASALLE cuernavaca, deberias ponerlo en tus retos , :) Saludos


24-May-2016 23:26
Alejandro Enrique Tellez Lopez

"La lógica de alguna orden como "if(c[++a][b]>c[a][++b])" es confusa y propensa a errores." Tienes muchisima razon , la logica de esto es erronea, yo pensaba que se iba aumentar la variable "a", solo en la condicion, pero haciendo una prueba rapida, la variable se aunmenta en todo el codigo. Lo que queria llegar ha hacer era comparar las coodenada de la derecha y la de abajo, de la coordenada actual.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)