人工智能课的一个小练习,直接DFS暴力搜索即可。
问题背景:给定两个水壶,一个可装4加仑水,一个能装3加仑水。水壶上没有任何度量标记。有一水龙头可用来往壶中灌水。问题是怎样在能装4加仑的水壶里恰好只装2加仑水。
这个问题的求解方法已在教材中给出。下面只是给出程序实现。
//对于水壶问题的定义的几个操作:
//0. 空操作
//1. 4加仑壶不满时将其加满
//2. 3加仑壶不满时将其加满
//3. 把4加仑水壶中的水全部倒出
//4. 把3加仑水壶中的水全部倒出
//5. 把3加仑水壶中的水往4加仑水壶中倒,直到4加仑水壶满
//6. 把4加仑水壶中的水往3加仑水壶中倒,直到3加仑水壶满
//7. 把3加仑水壶中的水全部倒往4加仑水壶中
//8. 把4加仑水壶中的水全部倒往3加仑水壶中
//解决的基本思路是利用状态空间法求解,设X为4加仑水壶的水量,Y是3加仑水壶的水量。
//则所有可能的(X,Y)序对作为状态空间M的状态集,操作{1, 2,3, 4,5, 6,7, 8}是输入字符集。
//开始状态是(0,0),终止状态是{(2,Y)},Y可能是0,1,2,3。
//当一个输入串是M的语言时,这个串就是水壶问题的一个可能方案。
//编程的考虑是:Water[5][4]标识数组,为1时,表示这个状态已经到达,为0时表示这个状态没有到达。
运行效果截图:
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