水壶问题 java.lang.OutOfMemoryError: Java 堆空间

为我的 AI 类编写一段代码,旨在列出给定三个水壶问题的所有可能状态(您可以装满任何水壶,或将尽可能多的水倒入另一个水壶,或清空任何水壶,如您可以按任意顺序多次)从空罐子开始。


由于某种原因,在记录了 88 个看似不同的状态后,第 89 个与第一个相同,我最终用完了空间,因为它循环了。


我认为这与我如何检查状态是否不同有关,但无法弄清楚。任何帮助将不胜感激。


import java.util.ArrayList;

    import java.util.List;


public class AI {

    private static final int[] start=new int[]{0,0,0};

    private static int[] jugs;

    public static void main(String[] args){

        jugs=new int[]{Integer.parseInt(args[0]), Integer.parseInt(args[1]),Integer.parseInt(args[2])};


    String out="";

    out=out.concat("{");

    for (int[] state:addStates(start,new ArrayList<>())) {

        out=out.concat("{"+state[0]+","+state[1]+","+state[2]+"}");

    }

    out=out.substring(0,out.length()-2).concat("}");

    System.out.println(out);


}


private static List<int[]> addStates(int[] start, List<int[]> states) {



    states.add(start);


    int[][] newStates={

            fillA(start),

            fillB(start),

            fillC(start),

            emptyA(start),

            emptyB(start),

            emptyC(start),

            pour(start,0,1),

            pour(start,0,2),

            pour(start,1,0),

            pour(start,1,2),

            pour(start,2,0),

            pour(start,2,1)

    };


    for (int[] child:newStates) {

        if (!has(states,child)) {

            states.addAll(addStates(child,states));

        }

    }

    System.out.println("close");

    return states;

}

private static boolean has(List<int[]> list, int[] e) { //finds out if list contains something with the same values as e

    for (int[] el:list) {

        boolean is=true;

        for(int i=0;i<e.length;i++){

            if (el[i]!=e[i]){

                is=false;

            }

        }

        if(is){

            return true;

        }

    }

    return false;

}


缥缈止盈
浏览 281回答 1
1回答

aluckdog

问题是我同时使用了states.add(start)and&nbsp;states.addAll(addStates(child,states)),这意味着我多次添加了每个元素。修复此问题后,代码运行良好。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java