lunes, 27 de agosto de 2012

Recursividad Torres de Hanoi C++

Problema:
Dadas tres varas y un numero N de discos predispuestos de forma ascendente desde el tope de la varilla se quiere pasar todos los discos desde la primera varilla hasta la tercera de manera que en ningun momento quede algun disco pequeño debajo de uno mas grande que el mismo

Solucion:
#include <iostream>
using namespace std;

void hanoi(char a, char b, char c, int n){
    if(n==1) cout << "Mover disco " << n << " desde " << a << " hasta " << c <<endl;
    else{
        hanoi(a, c, b, n-1);
        cout << "Mover disco " << n << " desde " << a << " hasta " << c <<endl;
        hanoi(b, a, c, n-1);
    }
}

int main(){
    char a = 'A', b = 'B', c = 'C';
    int n;

    cin >> n;
    hanoi(a, b, c, n);

    return 0;
}

domingo, 26 de agosto de 2012

Recursividad Decimal(Integer) a Binario(String) C++

Problema:
Dado un entero, crear un string que contenga su equivalente en binario

Solucion:
#include <iostream>
#include <sstream>
using namespace std;

string aString(int n, string a){
    stringstream aux;
    aux << n << a;
    a = aux.str();
    return a;
}

string convert(int num, string str){
    if(num<2){
        str = aString(num, str);
        return str;
    }
    else{
        str = aString(num%2, str);
        return convert(num/2, str);
    }
}

int main(){
    int num; string str;
    cout << "Introduzca numero a convertir"<<endl;
    cin >> num;

    str = convert(num, str);

    cout << "Su equivalente en binario es: "<<str <<endl;

    return 0;
}

Recursividad N reinas C++

Problema:
Se quiere saber todas las formas en la que se pueden colocar N reinas en un tablero de NxN sin que ninguna de estas sea capaz de atacar a otra.
(Cada  solucion se almacenara en un archivo llamado "solucionR")

Respuesta:
#include <iostream>
#include <fstream>
using namespace std;

class reina{
    public:

    bool **validar;
    char **tablero;
    fstream enter;
    int contador;
    int N;

    reina(int n){
        N = n;
        validar = new bool*[N];
        tablero = new char*[N];
        for(int i=0; i<N; i++){
            validar[i] = new bool[N];
            tablero[i] = new char[N];

            for(int j=0; j<N; j++){
                validar[i][j] = false;
                tablero[i][j] = '.';
            }
        }
        enter.open("solucionR.txt", fstream::out);
        enter << "Soluciones en tablero de " << N << "*"<< N <<endl<<endl;
        contador = 0;
    }

    void solucion(int x, int y, int n){
        tablero[x][y] = 'R';
        bloquear(x, y);

        if(n==N) mostrar();
        else{
            for(int i=0; i<N; i++){
                if(validar[i][y+1]==false) solucion(i, y+1, n+1);
            }
        }

        quitarRellenar(x, y);
    }

    void bloquear(int x, int y){
        int aux1, aux2;

        //horizontal
        aux2 = y;
        aux1 = 0;
        while(aux1<N){
            validar[aux1][aux2] = true;
            aux1++;
        }

        //vertical
        aux2 = 0;
        aux1 = x;
        while(aux2<N){
            validar[aux1][aux2] = true;
            aux2++;
        }

        //diagonal negativa
        aux1 = x; aux2 = y;
        while(aux1>0 && aux2>0){
            aux1--; aux2--;
        }
        aux1++; aux2++;
        while(aux1<N && aux2<N){
            validar[aux1][aux2] = true;
            aux1++; aux2++;
        }

        //diagonal positiva
        aux1 = x; aux2 = y;
        while(aux1<N && aux2>0){
            aux1++; aux2--;
        }
        aux1--; aux2++;
        while(aux1>=0 && aux2<N){
            validar[aux1][aux2] = true;
            aux1--; aux2++;
        }

    }

    void quitarRellenar(int x, int y){
        tablero[x][y] = '.';
        for(int i=0; i<N; i++){
            for(int j=0; j<N; j++){
                validar[i][j] = false;
            }
        }

        for(int i=0; i<N; i++){
            for(int j=0; j<N; j++){
                if(tablero[i][j]=='R') bloquear(i, j);
            }
        }
    }

    void mostrar(){
        contador++;
        enter << "Solucion N# "<< contador <<endl;
        for(int i=0; i<N; i++){
            for(int j=0; j<N; j++){
                enter << tablero[i][j] << " ";
            }
            enter <<endl;
        }
        enter <<endl;
    }

    void todoSol(){
        for(int i=0; i<N; i++){
            solucion(i, 0, 1);
        }
        enter.close();
    }


};

int main(){
    int n;
    cout <<"Introduzca numero de reinas"<<endl;
    cin >> n;

    reina *Queen = new reina(n);
    Queen->todoSol();

    cout <<"Se ha creado el archivo 'solucionR'"<<endl;

    return 0;
}

Recursividad Busqueda Binaria C++

Problema:
Se debe realizar un algoritmo recursivo que dado un arreglo de "n" enteros ordenado de forma ascendente y sin elementos repetidos, realize una busqueda binaria de un elemento "e"

Solucion:
#include <iostream>

using namespace std;

bool bBinaria(int arr[], int base, int tope, int e){
    int aux;
    aux = (base+tope)/2;

    if(arr[aux]!=e && (base==tope)) return false;
    if(arr[aux]==e) return true;
    if(arr[aux]<e) return bBinaria(arr, aux+1, tope, e);
    if(arr[aux]>e) return bBinaria(arr, base, aux-1, e);
}

int main(){
    int n, e;
    cout << "Proporcione el tamaño del arreglo"<<endl;
    cin >> c;
    int arr[n-1];

    cout <<"Introduzca elementos en el arreglo"<<endl;
    for(int i=0; i<c; i++){
        cin >> arr[i];
    }

    cout <<"Elemento a buscar"<<endl;
    cin >> e;

    if(bBinaria(arr, 0, n-1, e)) cout << "El elemento se encuentra en el arreglo"<<endl;
    else cout << "No se encontro el elemento" <<endl;

    return 0;
}

Recursividad Par/Impar C++

Problema:
Se quiere saber si un numero es par o impar de manera recursiva tal que:
  • bool par(0) = true;
  • bool impar(0) = false;
Respuesta:
#include <iostream>

using namespace std;

bool par(int);
bool impar(int);

bool par(int n){
    if(!n) return true;
    else return impar(n-1);
}

bool impar(int n){
    if(!n) return false;
    else return par(n-1);
}

int main(){
    int n;
    cin >> n;

    if(par(n)) cout << "Es par" <<endl;
    else cout << "Es impar" << endl;

    return 0;
}