Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Tupla<TipoRetorno, Iterador<Iterador<Tupla<int, int>>>> Sistema::CaminoCaballo(Tupla<int, int>& salida, Tupla<int, int>& destino, nat cantAPasar, nat tamTablero, Iterador<Tupla<int, int>>& pasar, Iterador<Tupla<int, int>>& noPasar) {
- Tupla<int, int> actual = salida;
- nat pasosOptimos = 99999999999999;
- nat pos = 0;
- Array<Tupla<int, int>> lista(tamTablero);
- Puntero<Lista<Array<Tupla<int, int>>>> solucion = new ListaImp<Array<Tupla<int, int>>>(Comparador<Array<Tupla<int, int>>>::Default);
- Tupla<int, int> aux = Tupla<int, int>(salida.Dato1, salida.Dato2);
- lista[0] = aux;
- CaminoCaballoBT(0, 1, salida, destino, cantAPasar, tamTablero, pasar, noPasar, 0, pasosOptimos, lista, solucion);
- nat cont = solucion->Largo() - 1;
- Array<Iterador<Tupla<int,int>>> ret(solucion->Largo());
- while (!solucion->EstaVacia()) {
- ret[cont] = solucion->Cabeza().ObtenerIterador();
- solucion->EliminarCabeza();
- cont--;
- }
- Tupla<TipoRetorno, Iterador<Iterador<Tupla<int,int>>>> retorno = Tupla<TipoRetorno, Iterador<Iterador<Tupla<int,int>>>>(OK, ret.ObtenerIterador());
- return retorno;
- }
- void Sistema::CaminoCaballoBT(nat cantPasar, nat pos, Tupla<int, int>& salida, Tupla<int, int>& destino, nat cantAPasar, nat tamTablero, Iterador<Tupla<int, int>>& pasar, Iterador<Tupla<int, int>>& noPasar, nat cantidadPasos, nat &pasosOptimo, Array<Tupla<int, int>> lista, Puntero<Lista<Array<Tupla<int, int>>>> &solucion){
- if (cantidadPasos > pasosOptimo)return;
- if (cantPasar >= cantAPasar && salida == destino && cantidadPasos < pasosOptimo) {
- nat posAux = 0;
- solucion->Vaciar();
- Array<Tupla<int, int>> sol(pos);
- while (posAux < pos) {
- sol[posAux] = lista[posAux];
- posAux++;
- }
- solucion->Insertar(sol);
- pasosOptimo = cantidadPasos;
- return;
- }
- if (cantPasar >= cantAPasar && salida == destino && cantidadPasos == pasosOptimo) {
- nat posAux = 0;
- Array<Tupla<int, int>> sol(pos);
- while (posAux < pos) {
- sol[posAux] = lista[posAux];
- posAux++;
- }
- solucion->Insertar(sol);
- return;
- }
- if ((salida.Dato1 > 1) && (salida.Dato2 > 0)) {
- Tupla<int, int> aux = Tupla<int, int>(salida.Dato1 - 2, salida.Dato2 - 1);
- if (pos <= 1 || lista[pos - 2] != aux) {
- if (PerteneceIteradorTupla(pasar, Tupla<int, int>(salida.Dato1 - 2, salida.Dato2 - 1))) {
- lista[pos] = aux;
- CaminoCaballoBT(cantPasar + 1, pos + 1, aux, destino, cantAPasar, tamTablero, pasar, noPasar, cantidadPasos + 1, pasosOptimo, lista, solucion);
- }
- else if (!PerteneceIteradorTupla(noPasar, Tupla<int, int>(salida.Dato1 - 2, salida.Dato2 - 1))) {
- lista[pos] = aux;
- CaminoCaballoBT(cantPasar, pos + 1, aux, destino, cantAPasar, tamTablero, pasar, noPasar, cantidadPasos + 1, pasosOptimo, lista, solucion);
- }
- }
- }
- if ((salida.Dato1 > 0) && (salida.Dato2 > 1)) {
- Tupla<int, int> aux = Tupla<int, int>(salida.Dato1 - 1, salida.Dato2 - 2);
- if (pos <= 1 || lista[pos - 2] != aux) {
- if (PerteneceIteradorTupla(pasar, Tupla<int, int>(salida.Dato1 - 1, salida.Dato2 - 2))) {
- lista[pos] = aux;
- CaminoCaballoBT(cantPasar + 1, pos + 1, aux, destino, cantAPasar, tamTablero, pasar, noPasar, cantidadPasos + 1, pasosOptimo, lista, solucion);
- }
- else if (!PerteneceIteradorTupla(noPasar, Tupla<int, int>(salida.Dato1 - 1, salida.Dato2 - 2))) {
- lista[pos] = aux;
- CaminoCaballoBT(cantPasar, pos + 1, aux, destino, cantAPasar, tamTablero, pasar, noPasar, cantidadPasos + 1, pasosOptimo, lista, solucion);
- }
- }
- }
- if ((salida.Dato1 > 1) && (salida.Dato2 + 1 < (int)tamTablero)) {
- Tupla<int, int> aux = Tupla<int, int>(salida.Dato1 - 2, salida.Dato2 + 1);
- if (pos <= 1 || lista[pos - 2] != aux) {
- if (PerteneceIteradorTupla(pasar, Tupla<int, int>(salida.Dato1 - 2, salida.Dato2 + 1))) {
- lista[pos] = aux;
- CaminoCaballoBT(cantPasar + 1, pos + 1, aux, destino, cantAPasar, tamTablero, pasar, noPasar, cantidadPasos + 1, pasosOptimo, lista, solucion);
- }
- else if (!PerteneceIteradorTupla(noPasar, Tupla<int, int>(salida.Dato1 - 2, salida.Dato2 + 1))) {
- lista[pos] = aux;
- CaminoCaballoBT(cantPasar, pos + 1, aux, destino, cantAPasar, tamTablero, pasar, noPasar, cantidadPasos + 1, pasosOptimo, lista, solucion);
- }
- }
- }
- if ((salida.Dato1 > 0) && (salida.Dato2 + 2 < (int)tamTablero)) {
- Tupla<int, int> aux = Tupla<int, int>(salida.Dato1 - 1, salida.Dato2 + 2);
- if (pos <= 1 || lista[pos - 2] != aux) {
- if (PerteneceIteradorTupla(pasar, Tupla<int, int>(salida.Dato1 - 1, salida.Dato2 + 2))) {
- lista[pos] = aux;
- CaminoCaballoBT(cantPasar + 1, pos + 1, aux, destino, cantAPasar, tamTablero, pasar, noPasar, cantidadPasos + 1, pasosOptimo, lista, solucion);
- }
- else if (!PerteneceIteradorTupla(noPasar, Tupla<int, int>(salida.Dato1 - 1, salida.Dato2 + 2))) {
- lista[pos] = aux;
- CaminoCaballoBT(cantPasar, pos + 1, aux, destino, cantAPasar, tamTablero, pasar, noPasar, cantidadPasos + 1, pasosOptimo, lista, solucion);
- }
- }
- }
- if ((salida.Dato1 + 1 < (int)tamTablero) && (salida.Dato2 + 2 < (int)tamTablero)) {
- Tupla<int, int> aux = Tupla<int, int>(salida.Dato1 + 1, salida.Dato2 + 2);
- if (pos <= 1 || lista[pos - 2] != aux) {
- if (PerteneceIteradorTupla(pasar, Tupla<int, int>(salida.Dato1 + 1, salida.Dato2 + 2))) {
- lista[pos] = aux;
- CaminoCaballoBT(cantPasar + 1, pos + 1, aux, destino, cantAPasar, tamTablero, pasar, noPasar, cantidadPasos + 1, pasosOptimo, lista, solucion);
- }
- else if (!PerteneceIteradorTupla(noPasar, Tupla<int, int>(salida.Dato1 + 1, salida.Dato2 + 2))) {
- lista[pos] = aux;
- CaminoCaballoBT(cantPasar, pos + 1, aux, destino, cantAPasar, tamTablero, pasar, noPasar, cantidadPasos + 1, pasosOptimo, lista, solucion);
- }
- }
- }
- if ((salida.Dato1 + 2 < (int)tamTablero) && (salida.Dato2 + 1 < (int)tamTablero)) {
- Tupla<int, int> aux = Tupla<int, int>(salida.Dato1 + 2, salida.Dato2 + 1);
- if (pos <= 1 || lista[pos - 2] != aux) {
- if (PerteneceIteradorTupla(pasar, Tupla<int, int>(salida.Dato1 + 2, salida.Dato2 + 1))) {
- lista[pos] = aux;
- CaminoCaballoBT(cantPasar + 1, pos + 1, aux, destino, cantAPasar, tamTablero, pasar, noPasar, cantidadPasos + 1, pasosOptimo, lista, solucion);
- }
- else if (!PerteneceIteradorTupla(noPasar, Tupla<int, int>(salida.Dato1 + 2, salida.Dato2 + 1))) {
- lista[pos] = aux;
- CaminoCaballoBT(cantPasar, pos + 1, aux, destino, cantAPasar, tamTablero, pasar, noPasar, cantidadPasos + 1, pasosOptimo, lista, solucion);
- }
- }
- }
- if ((salida.Dato1 + 2 < (int)tamTablero) && (salida.Dato2 > 0)) {
- Tupla<int, int> aux = Tupla<int, int>(salida.Dato1 + 2, salida.Dato2 - 1);
- if (pos <= 1 || lista[pos - 2] != aux) {
- if (PerteneceIteradorTupla(pasar, Tupla<int, int>(salida.Dato1 + 2, salida.Dato2 - 1))) {
- lista[pos] = aux;
- CaminoCaballoBT(cantPasar + 1, pos + 1, aux, destino, cantAPasar, tamTablero, pasar, noPasar, cantidadPasos + 1, pasosOptimo, lista, solucion);
- }
- else if (!PerteneceIteradorTupla(noPasar, Tupla<int, int>(salida.Dato1 + 2, salida.Dato2 - 1))) {
- lista[pos] = aux;
- CaminoCaballoBT(cantPasar, pos + 1, aux, destino, cantAPasar, tamTablero, pasar, noPasar, cantidadPasos + 1, pasosOptimo, lista, solucion);
- }
- }
- }
- if ((salida.Dato1 + 1 < (int)tamTablero) && (salida.Dato2 > 1)) {
- Tupla<int, int> aux = Tupla<int, int>(salida.Dato1 + 1, salida.Dato2 - 2);
- if (pos <= 1 || lista[pos - 2] != aux) {
- if (PerteneceIteradorTupla(pasar, Tupla<int, int>(salida.Dato1 + 1, salida.Dato2 - 2))) {
- lista[pos] = aux;
- CaminoCaballoBT(cantPasar + 1, pos + 1, aux, destino, cantAPasar, tamTablero, pasar, noPasar, cantidadPasos + 1, pasosOptimo, lista, solucion);
- }
- else if (!PerteneceIteradorTupla(noPasar, Tupla<int, int>(salida.Dato1 + 1, salida.Dato2 - 2))) {
- lista[pos] = aux;
- CaminoCaballoBT(cantPasar, pos + 1, aux, destino, cantAPasar, tamTablero, pasar, noPasar, cantidadPasos + 1, pasosOptimo, lista, solucion);
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement