小さな人工知能エクササイズクラスは、あなたが直接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 +
'}';
}
}
}