Advertisement
Guest User

Untitled

a guest
Jun 26th, 2016
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 7.15 KB | None | 0 0
  1. import java.util.ArrayList;
  2.  
  3. public class Main {
  4.    
  5.     // Tablero, donde P = Pared, L = Libre, Q = Queso
  6.     public static String[][] tablero = {{"P", "P", "P", "P", "P"},
  7.                                         {"P", "L", "P", "L", "Q"},
  8.                                         {"P", "L", "L", "L", "P"},
  9.                                         {"L", "L", "P", "L", "L"},
  10.                                         {"L", "L", "P", "L", "P"}};
  11.    
  12.     // Arreglo dinamico donde se guardan el historial de los movimientos realizados y exitosos
  13.     public static ArrayList<Movimiento> historial = new ArrayList();
  14.    
  15.     public static void main(String[] args) {
  16.         // Resolver el laberinto iniciando en la posicion (3,1)
  17.         // En la recursion hay que ir pasando el historial para ir agregando los movimientos
  18.         resolver(new Movimiento(3, 1), historial);
  19.        
  20.         // Imprime el historial de movimientos, que son los pasos para llevar a la meta
  21.         for(int i=0; i<historial.size(); i++) {
  22.             System.out.println("Paso " + (i+1) + ": " + historial.get(i).toString());
  23.         }
  24.     }
  25.    
  26.     // Donde se realiza el backtracking, donde recibe el siguiente movimiento y el historial de movimientos
  27.     public static boolean resolver(Movimiento actual, ArrayList<Movimiento> historial) {
  28.         // Caso de aceptacion
  29.         if(gano(actual)) {
  30.             historial.add(actual); // Agrega las coordenadas de la meta para quedar mas claro los pasos hasta llegar a la meta
  31.             return true;
  32.         }
  33.         else {
  34.             // Casos de rechazo
  35.             // 1. Primero verifica que el movimiento nuevo no se encuentre en el historial de movimientos
  36.             // 2. Luego verifica que el moviento sea valido, es decir que no llegue a una pared
  37.             // 3. Como se verifica el OutOfBound, la generacion de movimientos puede retornar null entonces se valida que exista
  38.             if(verificarMovimientoHistorial(actual) || verificarMovimientoValido(actual) || actual == null) {
  39.                 return false;
  40.             }
  41.  
  42.             // Como el movimiento es valido se agrega al historial de movimientos
  43.             historial.add(actual);
  44.            
  45.             // Llama al bactracking generando los nuevos movimientos, con una heuristica basica, es decir trata
  46.             // de resolver de una esquina inferior izquierda a una esquina superior derecha
  47.             // --------------
  48.             // |        _ / |
  49.             // |    _ /     |
  50.             // |  /         |
  51.             // --------------
  52.            
  53.             // Genera movimiento arriba, si el movimiento es valido sigue generando a partir de este nuevo movimiento
  54.             if(resolver(generarMovimientoArriba(actual.getPosX(), actual.getPosY()), historial)) {
  55.                 return true;
  56.             }
  57.            
  58.             // Genera movimiento derecha, si el movimiento es valido sigue generando a partir de este nuevo movimiento
  59.             if(resolver(generarMovimientoDerecha(actual.getPosX(), actual.getPosY()), historial)) {
  60.                 return true;
  61.             }
  62.            
  63.             // Genera movimiento izquierda, si el movimiento es valido sigue generando a partir de este nuevo movimiento
  64.             if(resolver(generarMovimientoIzquierda(actual.getPosX(), actual.getPosY()), historial)) {
  65.                 return true;
  66.             }
  67.            
  68.             // Genera movimiento abajo, si el movimiento es valido sigue generando a partir de este nuevo movimiento
  69.             if(resolver(generarMovimientoAbajo(actual.getPosX(), actual.getPosY()), historial)) {
  70.                 return true;
  71.             }
  72.            
  73.             // Si ninguno de los movimientos generados anteriormente ninguno es valido, se devuelve con el backtracking
  74.             // y borra del historial de movimientos los movimientos invalidos ya que no llegan a la meta
  75.             historial.remove(actual);
  76.         }
  77.        
  78.         // Retorna false ya que con esta "ruta" no se llega a ninguna solucion y corta la rama del arbol y sigue con
  79.         // la siguiente rama
  80.         return false;
  81.     }
  82.    
  83.     // Valida los limites de los indices
  84.     public static boolean validarMovimientoIndice(int posX, int posY) {
  85.         return (posX >= 0 && posX < tablero.length && posY >= 0 && posY < tablero.length);
  86.     }
  87.        
  88.     // Generar los movimientos basicos de arriba, izquierda, derecha, abajo
  89.     public static Movimiento generarMovimientoArriba(int posX, int posY) {
  90.         if(validarMovimientoIndice(posX - 1, posY)) {
  91.             return new Movimiento(posX - 1, posY);
  92.         }
  93.        
  94.         return null;
  95.     }
  96.    
  97.     public static Movimiento generarMovimientoAbajo(int posX, int posY) {
  98.         if(validarMovimientoIndice(posX + 1, posY)) {
  99.             return new Movimiento(posX + 1, posY);
  100.         }
  101.        
  102.         return null;
  103.     }
  104.    
  105.     public static Movimiento generarMovimientoIzquierda(int posX, int posY) {
  106.         if(validarMovimientoIndice(posX, posY - 1)) {
  107.             return new Movimiento(posX, posY - 1);
  108.         }
  109.        
  110.         return null;
  111.     }
  112.    
  113.     public static Movimiento generarMovimientoDerecha(int posX, int posY) {
  114.         if(validarMovimientoIndice(posX, posY + 1)) {
  115.             return new Movimiento(posX, posY + 1);
  116.         }
  117.        
  118.         return null;
  119.     }
  120.    
  121.     // Verificar si llego a la meta
  122.     public static boolean gano(Movimiento actual) {
  123.         boolean gano = false;
  124.        
  125.         if(tablero[actual.getPosX()][actual.getPosY()] == "Q") {
  126.             gano = true;
  127.         }
  128.        
  129.         return gano;
  130.     }
  131.    
  132.     // Verificar que no choque con una pared
  133.     public static boolean verificarMovimientoValido(Movimiento nuevo) {
  134.         boolean valido = false;
  135.        
  136.         if(tablero[nuevo.getPosX()][nuevo.getPosY()] == "P") {
  137.             valido = true;
  138.         }
  139.        
  140.         return valido;
  141.     }
  142.    
  143.     // Que ya pase por aqui, chequea el historial de movimientos
  144.     public static boolean verificarMovimientoHistorial(Movimiento nuevo) {
  145.         boolean existe = false;
  146.        
  147.         for(int i=0; i<historial.size(); i++) {
  148.             if(historial.get(i).equals(nuevo)) {
  149.                 existe = true;
  150.             }
  151.         }
  152.        
  153.         return existe;
  154.     }
  155. }
  156.  
  157. public class Movimiento {
  158.  
  159.     private int posX;
  160.     private int posY;
  161.    
  162.     public Movimiento(int posX, int posY) {
  163.         this.posX = posX;
  164.         this.posY = posY;
  165.     }
  166.  
  167.     public int getPosX() {
  168.         return posX;
  169.     }
  170.  
  171.     public void setPosX(int pos) {
  172.         this.posX = pos;
  173.     }
  174.  
  175.     public int getPosY() {
  176.         return posY;
  177.     }
  178.  
  179.     public void setPosY(int posY) {
  180.         this.posY = posY;
  181.     }
  182.    
  183.     @Override
  184.     public boolean equals(Object obj) {
  185.         Movimiento m = (Movimiento) obj;
  186.        
  187.         if(this.getPosX() == m.getPosX() && this.getPosY() == m.getPosY()) {
  188.             return true;
  189.         }
  190.         else {
  191.             return false;
  192.         }
  193.     }
  194.    
  195.     @Override
  196.     public String toString() {
  197.         return "X: " + this.getPosX() + " - " + "Y: " + this.getPosY();
  198.     }
  199. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement