2016-11-12 6 views
1

ランダムな5x5ボードのすべての単語を見つけるソリューションを実装するのには苦労しています。現在、それはいくつかの単語を返していますが、ほぼ完全なリストではありません。私は私の問題がfindforgeメソッドの中にforループを持っていると確信していますが、ifステートメントを8つの方向すべてに渡って続けるようにすることはできません。Boggleソルバの実装

import java.io.File; 
import java.util.*; 
public class RandomWordGame { 

    private static char[][] board = new char[5][5]; 
    private static Random r = new Random(); 
    private static ArrayList<String> dictionary = new ArrayList<String>(); 

    private static char[][] createBoard() 
    { 
     for (int i=0; i<board.length; i++) 
     { 
      for (int j=0; j<board.length; j++) 
      { 
       board[i][j] = (char) (r.nextInt(26) + 'a'); 
       System.out.print(board[i][j]); 
      } 
      System.out.println(""); 
     } 
     System.out.println(); 
     return board; 
    } 
    public static ArrayList<String> solver(char[][] board) 
    { 
     if(board == null) 
      System.out.println("Board cannot be empty"); 
     ArrayList<String> words = new ArrayList<String>(); 
     for(int i=0; i<board.length; i++) 
     { 
      for(int j=0; j<board[0].length; j++) 
      { 
       findWords(i, j, board[i][j] + ""); 
      } 
     } 
     return words; 
    } 
    public static void findWords(int i, int j, String currWord) 
    { 
     try 
     { 
      Scanner inputStream = new Scanner(new File("./dictionary.txt")); 
      while(inputStream.hasNext()) 
      { 
       dictionary.add(inputStream.nextLine()); 
      } 
      inputStream.close(); 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 

     for(i=0; i>=0 && i<board.length; i++) 
     { 
      for(j=0; j>=0; j++) 
      { 
       currWord += board[i][j]; 
       if(currWord.length()>5) 
        return; 
       if(dictionary.contains(currWord)) 
        System.out.println(currWord); 
      } 
     } 
    } 
    public static void main(String[] args) 
    { 
     board = createBoard(); 
     ArrayList<String> validWords = RandomWordGame.solver(board); 
     for(String word : validWords) 
      System.out.println(word); 
    } 
} 
+0

あなたの辞書ファイルはどのように見えますか? –

+0

_現在、いくつかの単語を返していますが、ほぼ完全なリストではありません...オブジェクト 'ArrayList words = new ArrayList ();'は投稿されたコードスニペットには決して入れられません。アイテム。 –

+0

forループでiとjを再初期化する必要はありません。しかし、それはすべてを修正することはありません。線形の方法で2D配列をループすると、探している順列の大部分が欠落します。また、辞書を一度構築する必要があります。あなたはメインの方法でこれを行うことができます。現在、プログラムはまったく同じ辞書を25回リメイクします。 –

答えて

0

このコードで面白いことがいくつかあります。 1つは、ソルバーメソッドから空のArrayListを返すことですが、findWordsから各結果を出力しているので、それはあなたを殺すことではありません。

問題は、findWordsメソッドがパズルの左上から文字を続けて追加するという点です。

//i=0 and j=0 means it will always start at the top left tile 
for(i=0; i>=0 && i<board.length; i++) 
{ 
    for(j=0; j>=0; j++) 
    { 
     //currWord is never reset, so it just keeps getting longer 
     currWord += board[i][j]; 
     if(currWord.length()>5) 
      return; 
     if(dictionary.contains(currWord)) 
      System.out.println(currWord); 
    } 
} 

は今、あなたは、あなたの選択したタイルで始まる単語を見つけている、との手紙の残りの部分は、彼らが左上から順パズルに追加されたのと同じ順序で選択されます。

私は、鉛筆と紙で質の高い時間を費やし、2次元配列インデックスとグリッド内での位置の関係を詳しく理解することをお勧めします。