0

そのため、NetBeansIDEのJavaでBoggleソルバーを実行しています。実行すると、完全に実行するのに約2時間かかるため、10分ほどで終了する必要があります。私のコードに何か問題がありますか、それとも大幅に高速化する方法がありますか?

public void findWords(String word, int iLoc, int jLoc, ArrayList<JLabel> labelsUsed){

    if(iLoc < 0 || iLoc >= 4 || jLoc < 0 || jLoc >= 4){
        return;
    }

    if(labelsUsed.contains(jLabels[iLoc][jLoc])){
        return;
    }

    word += jLabels[iLoc][jLoc].getText();
    labelsUsed.add(jLabels[iLoc][jLoc]);

    if(word.length() >= 3 && wordsPossible.contains(word)){
        wordsMade.add(word);
    }

    findWords(word, iLoc-1, jLoc, labelsUsed);
    findWords(word, iLoc+1, jLoc, labelsUsed);
    findWords(word, iLoc, jLoc-1, labelsUsed);
    findWords(word, iLoc, jLoc+1, labelsUsed);
    findWords(word, iLoc-1, jLoc+1, labelsUsed);
    findWords(word, iLoc-1, jLoc-1, labelsUsed);
    findWords(word, iLoc+1, jLoc-1, labelsUsed);
    findWords(word, iLoc+1, jLoc+1, labelsUsed);

    labelsUsed.remove(jLabels[iLoc][jLoc]);
}

ここからこのメソッドを呼び出します。

public void findWords(){
    ArrayList <JLabel> labelsUsed = new ArrayList<JLabel>();
    for(int i=0; i<jLabels.length; i++){
        for(int j=0; j<jLabels[i].length; j++){
            findWords(jLabels[i][j].getText(), i, j, labelsUsed);
            //System.out.println("Done");
        }
    }
}

編集:ところで、私はGUIを使用しており、ボード上の文字はJLabelを使用して表示されます。

4

2 に答える 2

2

さて、最初に、あなたは何度も実行します、それぞれは-可能であれば(重複要素なし)ArrayList.contains()など、より効率的なデータ構造の使用を検討する必要があります。labelsUsed.contains(..)O(n)Set

于 2012-12-03T16:57:01.457 に答える
0

反復的アプローチと再帰的アプローチを組み合わせているため、findWordsメソッドは時間ではなく時間のよう に呼び出されます。n^nn

メソッドの 8findWords...行を削除するか、 の 2 つのループを削除してください。findWordsformain

于 2012-12-03T17:02:30.200 に答える