ケトルの問題 - ブラインド検索の問題

小さな人工知能エクササイズクラスは、あなたが直接DFS暴力を検索することができます。

背景技術の問題2本のボトルを考えると、パッケージ水(4)ガロンは、水3ガロンを保持することができます。ノーケトル上のマークを測定します。水栓と利用可能なポット灌漑からがあります。質問は水だけの唯一の2ガロンをインストールケトルの4ガロンを保持することができる方法です。

この問題を解決することは教科書に記載されています。ここでは単に与えられたプログラムの実装です。

//いくつかのオペレーションのやかんの問題の定義:

// 0動作なし

//フィルポットに1.4ガロンは不満とき

//フィルポットに2.3ガロンは不満とき

// 3 4ガロンのやかんに水を空に

// 4 3ガロンのやかんに水を空に

4ガロンのやかんを注ぐやかんの水の// 5 3ガロン、4ガロンまでフルケトル

6 // 3ガロンまで3ガロンのやかん、フルやかんを注ぐためにやかんに水の4ガロンを置きます

//やかんの水の7。3ガロンは、すべての4ガロンの容器に落ちました

//やかんの水の8.4ガロンは、すべての3ガロンの容器に落ちました

//基本的な考え方を解決Yは、水のケトルの3ガロンで、状態空間法レッツXケトルの4ガロンを解決することです。

状態状態空間Mのセットのシーケンスとして(X、Y)//すべての可能な、操作{1、2、3、4、5、6、7、8}は、入力文字の集合です。

//開始状態(0,0)、終了状態が{(2、Y)}であり、Yは、0,1,2,3であってもよいです。

入力文字列がMの言語である場合は//文字列は、問題のやかんの可能な解決策です。

//プログラミング考慮事項である:水[5] [4]は配列を識別、状態0がこの状態に到達しないように表現、到達したことを示し、1です。

スクリーンショットの営業成績:
ここに画像を挿入説明

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 +
                    '}';
        }
    }
}
リリース7件のオリジナルの記事 ウォンの賞賛0 ビュー292

おすすめ

転載: blog.csdn.net/zwn888zwn/article/details/104840781