Foros del Web » Programación para mayores de 30 ;) » C/C++ »

bisqueda de una fila y columna en una matriz

Estas en el tema de bisqueda de una fila y columna en una matriz en el foro de C/C++ en Foros del Web. Buenas gnt mi primer tema en el foro bueno el tema en cuestiones el sgte. debo buscar en una matriz una fila y una columna ...
  #1 (permalink)  
Antiguo 25/03/2012, 14:19
 
Fecha de Ingreso: marzo-2012
Ubicación: Argentina
Mensajes: 111
Antigüedad: 12 años, 7 meses
Puntos: 12
bisqueda de una fila y columna en una matriz

Buenas gnt mi primer tema en el foro bueno el tema en cuestiones el sgte. debo buscar en una matriz una fila y una columna determinada el problema no es este sino lo q qiero saber s si hay un a manera de acr q la busqda sea optima lo q ic fue una busqda secuencial 1ª x fila y luego por columna.

Lo q qiero saber s si alguien conoc 1 libro dnd lo pueda leer o si m da una mano para mejorarlo

Muchas gracias.

Saludos.
  #2 (permalink)  
Antiguo 25/03/2012, 15:22
Avatar de cristian_qc  
Fecha de Ingreso: abril-2011
Mensajes: 43
Antigüedad: 13 años, 6 meses
Puntos: 8
Respuesta: bisqueda de una fila y columna en una matriz

A qué te referís con "buscar fila y columna" ?. Y qué tipo de matriz es ?
  #3 (permalink)  
Antiguo 25/03/2012, 17:26
 
Fecha de Ingreso: marzo-2012
Ubicación: Argentina
Mensajes: 111
Antigüedad: 12 años, 7 meses
Puntos: 12
Respuesta: bisqueda de una fila y columna en una matriz

El tema es asi debo buscar en una matrix n x n (cuadrada) si existe al menos una fila y columna completa de unos y ceros noc si me explico bien
  #4 (permalink)  
Antiguo 25/03/2012, 17:37
 
Fecha de Ingreso: diciembre-2011
Ubicación: CABA
Mensajes: 433
Antigüedad: 12 años, 10 meses
Puntos: 94
Respuesta: bisqueda de una fila y columna en una matriz

Hola! no creo q haya un libro que tenga un metodo para lo que vos necesitas. El ejercicio que propones es mas de practica que otra cosa.. Lo que podrias hacer es subir el codigo que hiciste y ver si se puede mejorar

Saludos
  #5 (permalink)  
Antiguo 26/03/2012, 07:19
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 7 meses
Puntos: 228
Respuesta: bisqueda de una fila y columna en una matriz

Suponiendo que todos los elementos son enteros positivos. Sino se le puede hacer unos retoques podrias sumar todos los elementos de las filas o columnas y ver cual es esa suma.

Si una columna tiene todo cero, la suma de todos los elementos de esta columna tiene que dar cero. Si son todos uno la suma daria N.

La idea seria la siguiente:
Supongamos que tenemos una matriz NxN. entonces definimos una matriz N+1 X N+1
Código C:
Ver original
  1. int matriz[N+1][N+1];
  2.  
  3. for(i=0;i< N ; i++)
  4.     for(j=0;j< N ; j++) {
  5.         matriz[i][N] += matriz[i][j];
  6.         matriz[N][j] += matriz[i][j];
  7.      }

Luegos comparas los elementos como te dije. Esto es lo mas rapido que se me ocurre por el momento. Solo se recorre una vez la matriz y podes determinar todas las columnas o filas que decis.

Saludos,
Espero que se entienda.
  #6 (permalink)  
Antiguo 26/03/2012, 09:01
 
Fecha de Ingreso: marzo-2012
Ubicación: Argentina
Mensajes: 111
Antigüedad: 12 años, 7 meses
Puntos: 12
Respuesta: bisqueda de una fila y columna en una matriz

De esa manera estaria recorriendo todas las filas de la matriz si entiendo bien...
Pongamoslo de esta manera si por ejemplo estoy buscando una fila toda de ceros entonces como decis si la fila es asi :

00001000

yo segun tu metodo sabria q no es enteramente de ceros cndo termine de sumar o sea al final de recorrerla (por favor corregime si no estoy en lo cierto ),en cambio si coloco un corte de control en el caso de buscar una fila de ceros debo verificar que no aparezca algun uno en caso de haber la busqueda termina de este modo tengo en el peor de los casos el uno estaria en la ult posicion y en el mejor caso en la primera tu metodo no me diria si es cero completo sino hasta la ultima en el peor y en el mjor de los casos ...

no c si me explico bien si talvez mi forma de pensarlo te parec erronea hazmelo saber por favor estoy para aprender y muchas gracias por la respuesta.

Saludos!!
  #7 (permalink)  
Antiguo 26/03/2012, 09:42
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 7 meses
Puntos: 228
Respuesta: bisqueda de una fila y columna en una matriz

Te explicaste bien...pero antes de esa explicacion vos estabas buscando filas y columnas con todos ceros o todos unos...ahora me cambiaste el ejercicio...solo buscas filas o columnas con ceros.

Pero lo que tu piensas esta bien...
  #8 (permalink)  
Antiguo 26/03/2012, 10:05
 
Fecha de Ingreso: marzo-2012
Ubicación: Argentina
Mensajes: 111
Antigüedad: 12 años, 7 meses
Puntos: 12
Respuesta: bisqueda de una fila y columna en una matriz

No bueno el ejemplo q di era para ceros pero aplica igualmente para unos.. el ejercicio es asi buscar filas y columnas de unos y ceros
  #9 (permalink)  
Antiguo 26/03/2012, 14:58
Avatar de cristian_qc  
Fecha de Ingreso: abril-2011
Mensajes: 43
Antigüedad: 13 años, 6 meses
Puntos: 8
Respuesta: bisqueda de una fila y columna en una matriz

Yo creía que lo que pedías era encontrar una fila, digamos " 0,1,0" en una matriz, digamos:
0, 1, 0
1, 1, 1
0, 1, 0.

En este caso hay que recorrer fila por fila, o columna por columna, y comparar los elementos.
En el caso de que quieras saber si una fila/columna está compuesta enteramente por el mismo número, pasas dicho número a una función que recorra las filas/columnas y retorne falso exactamente cuando encuentre el número pasado como parámetro, o verdadero cuando finaliza el recorrido.
Es decir que si se encuentra un número diferente no se recorre el resto de la fila/columna.
  #10 (permalink)  
Antiguo 26/03/2012, 20:51
 
Fecha de Ingreso: marzo-2012
Ubicación: Argentina
Mensajes: 111
Antigüedad: 12 años, 7 meses
Puntos: 12
Respuesta: bisqueda de una fila y columna en una matriz

Si si lo que hice es algo asi


Código C++:
Ver original
  1. #include "busqueda.h"
  2.  
  3. using namespace std;
  4.  
  5. /*Metodo que al recibir
  6.  * un argumento de tipo string
  7.  * identifica si la busqueda
  8.  * es por columna o fila
  9.  * utiliza un corte de control que identifica
  10.  * si hay cemento en caso contrario devuelve TRUE
  11.  * */
  12. bool buscarCaminoTierra(int matriz[MAXIMO][MAXIMO],int ultpos,int indice,string tipoBusqueda){
  13.  
  14.     bool encontrado  = true;
  15.     bool esCemento = false;
  16.  
  17.     if(tipoBusqueda == FILA){
  18.         for(int i = 0;i < ultpos && !esCemento;i++){
  19.             cout<<"Buscando camino de tierra"<<endl;
  20.             if(matriz[indice][i] == CEMENTO)
  21.                 esCemento = true;
  22.         }
  23.     }else
  24.         for(int i = 0;i < ultpos && !esCemento;i++){
  25.             cout<<"Buscando camino de tierra"<<endl;
  26.             if(matriz[i][indice] == CEMENTO)
  27.                 esCemento = true;
  28.         }
  29.  
  30.     return (encontrado = esCemento == false ? encontrado : !encontrado);
  31.  
  32. }
  33. /*Metodo que al recibir
  34.  * un argumento de tipo string
  35.  * identifica si la busqueda
  36.  * es por columna o fila
  37.  * utiliza un corte de control que identifica
  38.  * si hay tierra en caso contrario devuelve TRUE
  39.  * */
  40. bool buscarCaminoCemento(int matriz[MAXIMO][MAXIMO],int ultpos,int indice,string tipoBusqueda){
  41.  
  42.     bool encontrado  = true;
  43.     bool esTierra = false;
  44.  
  45.     if(tipoBusqueda == FILA){
  46.         for(int i = 0;i < ultpos && !esTierra;i++){
  47.             cout<<"Buscando camino de cemento"<<endl;
  48.             if(matriz[indice][i] == TIERRA)
  49.                 esTierra = true;
  50.         }
  51.     }else
  52.         for(int i = 0;i < ultpos && !esTierra;i++){
  53.             cout<<"Buscando camino de cemento"<<endl;
  54.             if(matriz[i][indice] == TIERRA)
  55.                 esTierra = true;
  56.         }
  57.  
  58.     return (encontrado = esTierra == false ? encontrado : !encontrado);
  59.  
  60. }
  61. /*Busca por fila tanto tierra como cemento
  62.  * si encuentra una ocurrencia de ambos sale caso
  63.  * contrario sigue la busqueda
  64.  * */
  65. void buscarCaminoFila(int matriz[MAXIMO][MAXIMO],int rangoFila,int rangoCol){
  66.  
  67.     cout<<BUSQUEDA_FILA<<endl;
  68.     bool buscoCemento = false;bool buscoTierra = false;
  69.     int encontroCemento = 0;
  70.     int encontroTierra  = 0;
  71.     for(int i = 0;(!encontroCemento == 1 || !encontroTierra == 1) && i < rangoFila ;i++){
  72.         buscoCemento = buscarCaminoCemento(matriz,rangoCol,i,FILA) == true ? true : false;
  73.         controloBusqueda(buscoCemento,buscoTierra,encontroCemento,encontroTierra,i,FILA);
  74.         buscoTierra  = buscarCaminoTierra(matriz,rangoCol,i,FILA)  == true ? true : false;
  75.         controloBusqueda(buscoCemento,buscoTierra,encontroCemento,encontroTierra,i,FILA);
  76.     }
  77. }
  78. /*Busca por columna tanto tierra como cemento
  79.  * si encuentra una ocurrencia de ambos sale caso
  80.  * contrario sigue la busqueda
  81.  * */
  82. void buscarCaminoColumna(int matriz[MAXIMO][MAXIMO],int rangoFila,int rangoCol){
  83.  
  84.     cout<<BUSQUEDA_COLUMNA<<endl;
  85.     bool buscoCemento,buscoTierra;
  86.     int encontroCemento = 0;
  87.     int encontroTierra  = 0;
  88.     for(int i = 0;(!encontroCemento == 1 || !encontroTierra == 1) && i < rangoCol ;i++){
  89.         buscoTierra  = buscarCaminoTierra(matriz,rangoFila,i,COL)  == true ? true : false;
  90.         controloBusqueda(buscoCemento,buscoTierra,encontroCemento,encontroTierra,i,COL);
  91.         buscoCemento = buscarCaminoCemento(matriz,rangoFila,i,COL) == true ? true : false;
  92.         controloBusqueda(buscoCemento,buscoTierra,encontroCemento,encontroTierra,i,COL);
  93.     }
  94. }
  95. /*Se encarga de verificar si hay un
  96.  * suceso de cemento o tierra recibiendo un parametro
  97.  * bool de ambos e incrementa al recibir un TRUE de uno
  98.  * de los dos o ambos e imprime el resultado*/
  99. void controloBusqueda(bool buscoCemento,bool buscoTierra,int &encontroCemento,int &encontroTierra,int indice,string filaCol){
  100.  
  101.     if(buscoCemento || buscoTierra){
  102.         if(buscoCemento){
  103.             encontroCemento++;
  104.             printResult(indice,encontroCemento,CEMENTO,filaCol);
  105.         }
  106.         if(buscoTierra){
  107.             encontroTierra++;
  108.             printResult(indice,encontroTierra,TIERRA,filaCol);
  109.         }
  110.     }else
  111.         printResult(indice,encontroTierra,TIERRA,filaCol);
  112. }
  113.  
  114.  
  115. void buscarCaminos(int matriz[MAXIMO][MAXIMO],int rangoFila,int rangoCol){
  116.  
  117.     buscarCaminoFila(matriz,rangoFila,rangoCol);
  118.     buscarCaminoColumna(matriz,rangoFila,rangoCol);
  119.     mostrarResultado(matriz,rangoFila,rangoCol);
  120.  
  121. }
  122.  
  123. /*Formatea la salida por consola
  124.  * identificando si es fila o columna */
  125. void printResult(int fila,int encontro,int tipo,string filaCol){
  126.  
  127.     stringstream ss;
  128.     string frase;
  129.     ss<<++fila;
  130.     frase = filaCol == COL ? "Encontro en " + COL + " " + ss.str() : "Encontro en " + FILA + " " +ss.str();
  131.     frase = tipo == CEMENTO ? frase + " Cemento": frase + " Tierra";
  132.     frase = encontro == 1 ? frase : "No encontro";
  133.     cout<<frase<<endl;
  134. }

digan si se puede mejorar gracias !!!

Etiquetas: columna, fila, matriz
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:38.