#include "busqueda.h"
using namespace std;
/*Metodo que al recibir
* un argumento de tipo string
* identifica si la busqueda
* es por columna o fila
* utiliza un corte de control que identifica
* si hay cemento en caso contrario devuelve TRUE
* */
bool buscarCaminoTierra(int matriz[MAXIMO][MAXIMO],int ultpos,int indice,string tipoBusqueda){
bool encontrado = true;
bool esCemento = false;
if(tipoBusqueda == FILA){
for(int i = 0;i < ultpos && !esCemento;i++){
cout<<"Buscando camino de tierra"<<endl;
if(matriz[indice][i] == CEMENTO)
esCemento = true;
}
}else
for(int i = 0;i < ultpos && !esCemento;i++){
cout<<"Buscando camino de tierra"<<endl;
if(matriz[i][indice] == CEMENTO)
esCemento = true;
}
return (encontrado = esCemento == false ? encontrado : !encontrado);
}
/*Metodo que al recibir
* un argumento de tipo string
* identifica si la busqueda
* es por columna o fila
* utiliza un corte de control que identifica
* si hay tierra en caso contrario devuelve TRUE
* */
bool buscarCaminoCemento(int matriz[MAXIMO][MAXIMO],int ultpos,int indice,string tipoBusqueda){
bool encontrado = true;
bool esTierra = false;
if(tipoBusqueda == FILA){
for(int i = 0;i < ultpos && !esTierra;i++){
cout<<"Buscando camino de cemento"<<endl;
if(matriz[indice][i] == TIERRA)
esTierra = true;
}
}else
for(int i = 0;i < ultpos && !esTierra;i++){
cout<<"Buscando camino de cemento"<<endl;
if(matriz[i][indice] == TIERRA)
esTierra = true;
}
return (encontrado = esTierra == false ? encontrado : !encontrado);
}
/*Busca por fila tanto tierra como cemento
* si encuentra una ocurrencia de ambos sale caso
* contrario sigue la busqueda
* */
void buscarCaminoFila(int matriz[MAXIMO][MAXIMO],int rangoFila,int rangoCol){
cout<<BUSQUEDA_FILA<<endl;
bool buscoCemento = false;bool buscoTierra = false;
int encontroCemento = 0;
int encontroTierra = 0;
for(int i = 0;(!encontroCemento == 1 || !encontroTierra == 1) && i < rangoFila ;i++){
buscoCemento = buscarCaminoCemento(matriz,rangoCol,i,FILA) == true ? true : false;
controloBusqueda(buscoCemento,buscoTierra,encontroCemento,encontroTierra,i,FILA);
buscoTierra = buscarCaminoTierra(matriz,rangoCol,i,FILA) == true ? true : false;
controloBusqueda(buscoCemento,buscoTierra,encontroCemento,encontroTierra,i,FILA);
}
}
/*Busca por columna tanto tierra como cemento
* si encuentra una ocurrencia de ambos sale caso
* contrario sigue la busqueda
* */
void buscarCaminoColumna(int matriz[MAXIMO][MAXIMO],int rangoFila,int rangoCol){
cout<<BUSQUEDA_COLUMNA<<endl;
bool buscoCemento,buscoTierra;
int encontroCemento = 0;
int encontroTierra = 0;
for(int i = 0;(!encontroCemento == 1 || !encontroTierra == 1) && i < rangoCol ;i++){
buscoTierra = buscarCaminoTierra(matriz,rangoFila,i,COL) == true ? true : false;
controloBusqueda(buscoCemento,buscoTierra,encontroCemento,encontroTierra,i,COL);
buscoCemento = buscarCaminoCemento(matriz,rangoFila,i,COL) == true ? true : false;
controloBusqueda(buscoCemento,buscoTierra,encontroCemento,encontroTierra,i,COL);
}
}
/*Se encarga de verificar si hay un
* suceso de cemento o tierra recibiendo un parametro
* bool de ambos e incrementa al recibir un TRUE de uno
* de los dos o ambos e imprime el resultado*/
void controloBusqueda(bool buscoCemento,bool buscoTierra,int &encontroCemento,int &encontroTierra,int indice,string filaCol){
if(buscoCemento || buscoTierra){
if(buscoCemento){
encontroCemento++;
printResult(indice,encontroCemento,CEMENTO,filaCol);
}
if(buscoTierra){
encontroTierra++;
printResult(indice,encontroTierra,TIERRA,filaCol);
}
}else
printResult(indice,encontroTierra,TIERRA,filaCol);
}
void buscarCaminos(int matriz[MAXIMO][MAXIMO],int rangoFila,int rangoCol){
buscarCaminoFila(matriz,rangoFila,rangoCol);
buscarCaminoColumna(matriz,rangoFila,rangoCol);
mostrarResultado(matriz,rangoFila,rangoCol);
}
/*Formatea la salida por consola
* identificando si es fila o columna */
void printResult(int fila,int encontro,int tipo,string filaCol){
stringstream ss;
string frase;
ss<<++fila;
frase = filaCol == COL ? "Encontro en " + COL + " " + ss.str() : "Encontro en " + FILA + " " +ss.str();
frase = tipo == CEMENTO ? frase + " Cemento": frase + " Tierra";
frase = encontro == 1 ? frase : "No encontro";
cout<<frase<<endl;
}