如何遍历一个2d char数组搜索java中的单词?

我在完成学校任务时遇到了麻烦,并且非常欣赏一些见解。 我被要求使用25×25 2d char数组创建一个wordsearch,并以某种方式通过开发一种算法来遍历该数组,该算法将搜索它以查找21个预定义的单词。

到目前为止,我已经能够创建一个我需要找到的字体的粗糙数组,以及在每个位置放置字符的二维数组。

in = new ASCIIDataFile("wordsearch.txt"); display = new ASCIIDisplayer(); int numberWords = in.readInt(); wordlist = new char[numberWords][]; for (int i =0; i<wordlist.length; i++){ wordlist[i] = in.readLine().toUpperCase().toCharArray(); } for(int i = 0;i<wordlist.length; i++){ display.writeLine(" "); for(int j = 0;j<wordlist[i].length; j++){ display.writeChar(wordlist[i][j]); } } //done wordlists int gridLength = in.readInt(); int gridHeight = in.readInt(); grid = new char[gridHeight][gridLength]; for(int i = 0;i<gridLength; i++){ grid[i] = in.readLine().toCharArray(); } 

我在创建算法以搜索2d数组并将其与wordlist中的字符匹配时遇到了问题。 我应该做出不同的方法,用于搜索向前,向后和对角线。 我一直在努力进行前瞻性搜索。

我真的不知道怎么解决这个问题,到目前为止我所拥有的只是

 for(int k = 0; k<wordlist.length; k++){ int p = 0; for(int row = 0;row<gridLength; row++){ for(int col = 0;col<gridHeight; col++){ while(p<wordlist[k].length){ if(grid[row][col] == wordlist[k][p]){ //do something } } } } } 

}

任何帮助或指针将不胜感激!

诀窍是,您不需要分别考虑所有8个可能的方向。 您可以使用向量表示每个。 例如,’forward’方向将是(0, 1) (第一行编号,然后是列) – 指向右边的向量。 对角线的左上方向为(-1, -1) 。 反正你懂这个意思。

然后,只需创建一个函数

 boolean findWord(int row, int col, int d_row, int d_col, char[] word); 

它可以采用当前矩阵位置( (row, col) ,其中单词应该开始),搜索方向( (d_row, d_col) )和要查找的单词。 它返回给定的单词是否在这里。
然后你可以为不同的方向调用它,例如

 findWord(row, col, -1, 0, word); findWord(row, col, -1, 1, word); findWord(row, col, 0, 1, word); ... 

(我按时钟顺序列出它们)

实现findWord只是通过d_rowd_col递增当前位置,直到我们发现字符或单词结尾不匹配。 基本程序是这样的

 while (row < total_rows && row >= 0 && col < total_columns && col >= 0) { // check character here ... row += d_row; col += d_col; } 

我打赌你将拥有40行的所有处理代码(输入读取除外)。

首先,您需要了解如何在较大的字符串中搜索短字符串。 这里有几个选项:从最简单的算法到更复杂的算法(如Knuth Morris Pratt和家族)。 您可以在此处获取他们的描述列表: http : //en.wikipedia.org/wiki/String_searching_algorithm 。 我强烈建议你先尝试一下天真的搜索。

一旦您可以在另一个字符串中搜索字符串,您将需要抽象访问更大字符串的方式并使矩阵数据适应它。

基本上假设这个矩阵:

  1 2 3 4 ------- 1| abcd 2| bcda 3| cdab 4| dabc 

这个字符串abc

你将首先制作一些代码,以便能够在abcdbcdacdab等中找到abc

一旦你能做到这一点,你应该建立提取(对于每种可能的查找类型:水平,垂直,对角线,反向对角线)系列字符的中间步骤,并将先前的算法应用于它们。

例如,如果我们想要对角搜索,我们将从矩阵生成7个字符串:

 a bb ccc dddd aaa bb c 

如果你想横向搜索,你会生成这些字符串:

 abcd bcda cdab dabc 

并在每个字符串内搜索。

一旦这个工作,你应该结合搜索和从矩阵中读取适当的字符。 希望如果你遵循这条道路,你将能够弄明白:)。

祝你好运。

要在任意尺寸的任何2D矩阵中对角移动,希望以下function有所帮助。

 public static void prinDiagonalsInGrid(char[][] grid, int rows, int cols) { String result = ""; int min = Math.min(rows, cols); int max = Math.max(rows, cols); int sameLengthDiagonals = max - min + 1; int totalDiagonals = (rows + cols) - 1; for (int p = 0; p < totalDiagonals; p++) { int xIndex; int maxCnt; if (p < (min - 1)) // First diagonals { maxCnt = xIndex = p; } // diagonals of equal length in the middle else if (sameLengthDiagonals != 0 && p >= (min - 1) && p < (sameLengthDiagonals + min - 1)) { if (rows < cols) xIndex = rows - 1; else xIndex = p; maxCnt = min - 1; } else // Last diagonals { xIndex = rows - 1; maxCnt = totalDiagonals - p - 1; } for (int cnt = 0; cnt <= maxCnt; cnt++) { result += grid[xIndex][p - xIndex] + " "; --xIndex; } result += "\n"; } System.out.println(result); }