【问题标题】:Boggle solver implementationBoggle 求解器实现
【发布时间】:2016-11-12 01:49:45
【问题描述】:

我正在努力实施一种解决方案,以在随机的 5x5 字母板上找到所有单词。目前它正在返回一些单词,但几乎没有返回完整列表。我很确定我的问题存在于我的 for 循环的 findWords 方法中,但我不知道如何使 if 语句继续在所有 8 个方向上遍历。

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);
    }
}

【问题讨论】:

  • 你的字典文件是什么样的?
  • 目前它只返回了几个单词,但还没有返回完整列表... 由于对象ArrayList&lt;String&gt; words = new ArrayList&lt;String&gt;(); 从未填充到已发布的代码 sn-p 中,因此我高度评价怀疑它可以包含任何项目。
  • 您不需要在 for 循环中重新初始化 i 和 j。但这并不能解决所有问题。以线性方式循环遍历 2D 数组将错过您正在寻找的大多数排列。此外,您应该构建字典一次。您可以在 main 方法中执行此操作。现在,您的程序将完全相同的字典重新制作了 25 次。

标签: java file dictionary arraylist boggle


【解决方案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】:

    使用 DFS 方法的 Java 实现

        import java.util.Arrays;
    
        public class WordBoggle {
    
        static int[] dirx = { -1, 0, 0, 1 };
        static int[] diry = { 0, -1, 1, 0 };
    
        public static void main(String[] args) {
            char[][] board = { { 'A', 'B', 'C', 'E' }, { 'S', 'F', 'C', 'S' }, { 'A', 'D', 'E', 'E' } };
    
            String word = "ABFSADEESCCEA";
            System.out.println(exist(board, word));
        }
    
        static boolean exist(char[][] board, String word) {
            if (board == null || board.length == 0 || word == null || word.isEmpty())
                return false;
            boolean[][] visited = new boolean[board.length][board[0].length];
            for (int i = 0; i < board.length; i++) {
                resetVisited(visited);
                for (int j = 0; j < board[0].length; j++) {
                    if (board[i][j] == word.charAt(i)) {
                        return DFS(board, word, i, j, 1, visited);
                    }
                }
            }
            return false;
        }
    
        static void resetVisited(boolean[][] visited) {
            for (int l = 0; l < visited.length; l++) {
                Arrays.fill(visited[l], false);
            }
        }
    
        static boolean DFS(char[][] board, String word, int i, int j, int k, boolean[][] visited) {
            visited[i][j] = true;
            if (k >= word.length())
                return true;
            for (int z = 0; z < 4; z++) {
                if (isValid(board, i + dirx[z], j + diry[z], visited)) {
                    if (word.charAt(k) == board[i + dirx[z]][j + diry[z]]) {
    
                        return DFS(board, word, i + dirx[z], j + diry[z], k + 1, visited);
                    }
    
                }
            }
            return false;
        }
    
        static boolean isValid(char[][] board, int i, int j, boolean[][] visited) {
            return (i >= 0 && i < board.length && j >= 0 && j < board[0].length && !visited[i][j]);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 2020-05-09
      • 2020-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多