hervidor problema - el problema de la búsqueda a ciegas

Una clase de ejercicio de la inteligencia artificial pequeño, se puede buscar directamente la violencia DFS.

problema ANTECEDENTES: Dado dos botella, un envase (4) galones de agua, puede contener una 3 galones de agua. No hay marcas de medición en la caldera. Hay un grifo de agua y desde el riego olla disponible. La cuestión es cómo puede contener cuatro litros de caldera se acaban de instalar sólo dos galones de agua.

La solución de este problema se da en el libro de texto. Éstos son sólo la aplicación del programa dado.

// definición de los problemas de la caldera de varias operaciones:

// 0. Ninguna operación

// cuando 1,4 galones a la olla de llenado insatisfechos

// cuando 2.3 galones a la olla de llenado insatisfechos

// 3 a 4 galones Vaciar el agua en el hervidor

// 4 a 3 galones Vaciar el agua en el hervidor

// 5 a 3 galones de agua en el hervidor para verter cuatro galones, caldera completa hasta cuatro galones

6 // Ponga cuatro galones de agua en la caldera para verter tres galones, caldera llena hasta 3 galones

// 7. 3 galones de agua en el hervidor de agua cayeron a 4 galones hervidor

// 8. Para 4 galones de agua en el hervidor todos cayeron a 3 galones hervidor

// resolver idea básica es resolver el derecho del espacio estado Sea X 4 galones de agua de caldera, Y es 3 galones de agua de caldera.

// Todos los posibles (X, Y) como la secuencia del conjunto de espacio de estado M estados, la operación de {1, 2, 3, 4, 5, 6, 7, 8} es un conjunto de caracteres de entrada.

// estado de arranque (0,0), el estado de terminación es {(2, Y)}, Y puede ser 0,1,2,3.

// Cuando una cadena de entrada es el idioma de M, la cadena es una posible solución del problema caldera.

// consideraciones de programación son: agua [5] [4] identifica una matriz, es 1, lo que indica que el estado se ha alcanzado, expresado como 0 no llega a este estado.

los resultados operativos de pantalla:
Aquí Insertar imagen Descripción

el código de Java:

public class 水壶问题 {
    static int maxX=4,maxY=3;
    static int[][] water=new int[maxX+1][maxY+1];
    static LinkedList<Output> path=new LinkedList<>();
    static int resCount=1;
    public static void main(String[] args) {
        jiashui(0,0);
    }
    public static void jiashui(int x,int y){
        if (x==2){
            System.out.println("第"+(resCount++)+"种解决方案:");
            System.out.println("4加仑水壶\t3加仑水壶\t所使用的操作");
            path.forEach(System.out::println);
            return;
        }
        if (water[0][0]==0){
            water[0][0]=1;
            path.add(new Output(0,0,0));
            jiashui(0,0);
            path.removeLast();
            water[0][0]=0;
        }
        if (x<maxX && water[maxX][y]==0){
            water[maxX][y]=1;
            path.add(new Output(maxX,y,1));
            jiashui(maxX,y);
            path.removeLast();
            water[maxX][y]=0;
        }
        if (y<maxY && water[x][maxY]==0){
            water[x][maxY]=1;
            path.add(new Output(x,maxY,2));
            jiashui(x,maxY);
            path.removeLast();
            water[x][maxY]=0;
        }
        if (x>0 && water[0][y]==0){
            water[0][y]=1;
            path.add(new Output(0,y,3));
            jiashui(0,y);
            path.removeLast();
            water[0][y]=0;
        }
        if (y>0 && water[x][0]==0){
            water[x][0]=1;
            path.add(new Output(x,0,4));
            jiashui(x,0);
            path.removeLast();
            water[x][0]=0;
        }
        if (x+y>=maxX &&water[maxX][x+y-maxX]==0){
            water[maxX][x+y-maxX]=1;
            path.add(new Output(maxX,x+y-maxX,5));
            jiashui(maxX,x+y-maxX);
            path.removeLast();
            water[maxX][x+y-maxX]=0;
        }
        if (x+y>=maxY &&water[x+y-maxY][maxY]==0){
            water[x+y-maxY][maxY]=1;
            path.add(new Output(x+y-maxY,maxY,6));
            jiashui(x+y-maxY,maxY);
            path.removeLast();
            water[x+y-maxY][maxY]=0;
        }
        if(x+y<=maxX && y>0&& water[x+y][0]==0){
            water[x+y][0]=1;
            path.add(new Output(x+y,0,7));
            jiashui(x+y,0);
            path.removeLast();
            water[x+y][0]=0;
        }
        if(x+y<=maxY && x>0&&water[0][x+y]==0){
            water[0][x+y]=1;
            path.add(new Output(0,x+y,8));
            jiashui(0,x+y);
            path.removeLast();
            water[0][x+y]=0;
        }


    }
    private static class Output{
        int x;
        int y;
        int opt;
        public Output(int x,int y,int opt){
            this.x=x;
            this.y=y;
            this.opt=opt;
        }

        @Override
        public String toString() {
            return "Output{" +
                    "x=" + x +
                    ", y=" + y +
                    ", opt=" + opt +
                    '}';
        }
    }
}
Publicado siete artículos originales · ganado elogios 0 · Vistas 292

Supongo que te gusta

Origin blog.csdn.net/zwn888zwn/article/details/104840781
Recomendado
Clasificación