2013-03-26 53 views
0

所以,我一直负责使用2d数组网格创建一个单词搜索程序。单词搜索在java中使用2d数组 - 通过第二个字母

到目前为止,我的代码可以在网格中找到所有2个字母的单词,但是超出2个字母的长度并且代码跳过它们。我现在在凌晨2点已经疲惫不堪,所以它可能是一件明显缺少的东西,但如果没有,请帮我解决问题?

当前的搜索代码:

/** 
    * Searches for a word in this LetterGrid using traditional WordSearch 
    * rules. 
    * 
    * @param word 
    *   the word to look for 
    */ 
    public boolean wordSearch(String word) 
    { 
      // Check each letter in grid 
      for (int row = 0; row < this.noOfRows; row++) 
      { 
        for (int col = 0; col < this.rowLength; col++) 
        { 
          if (grid[row][col] == word.charAt(0) && word.length() > 1) 
          { 
            return gridCheck(row, col, word, 1); 
          } 
          else if (grid[row][col] == word.charAt(0)) 
          { 
            return true; 
          } 
        } 

      } 
      return false; 
    } 

    public boolean gridCheck(int row, int col, String word, int charToFind) 
    { 

      if (charToFind == word.length() - 1) 
      { 
        return true; 
      } 
      else if (charToFind < word.length() - 1) 
      { 
        // Where is the letter being checked? -contingency check- 
        // if letter being checked is not touching any edge [most likely] 
        if (row > 0 && row < this.noOfRows && col > 0 
            && col < this.rowLength) 
        { 
          // FOR CODES SEE CHECKPLACES.TXT 
          // A 
          if (grid[row - 1][col - 1] == word.charAt(charToFind)) 
          { 
            gridCheck(row - 1, col - 1, word, 
                word.charAt(charToFind + 1)); 
          } 
          // B 
          else if (grid[row - 1][col] == word.charAt(charToFind)) 
          { 
            gridCheck(row - 1, col, word, word.charAt(charToFind + 1)); 
          } 
          // C 
          else if (grid[row - 1][col + 1] == word.charAt(charToFind)) 
          { 
            gridCheck(row - 1, col + 1, word, 
                word.charAt(charToFind + 1)); 
          } 
          // D 
          else if (grid[row][col - 1] == word.charAt(charToFind)) 
          { 
            gridCheck(row, col - 1, word, word.charAt(charToFind + 1)); 
          } 
          // E 
          else if (grid[row][col + 1] == word.charAt(charToFind)) 
          { 
            gridCheck(row, col + 1, word, word.charAt(charToFind + 1)); 
          } 
          // F 
          else if (grid[row + 1][col - 1] == word.charAt(charToFind)) 
          { 
            gridCheck(row + 1, col - 1, word, 
                word.charAt(charToFind + 1)); 
          } 
          // G 
          else if (grid[row + 1][col] == word.charAt(charToFind)) 
          { 
            gridCheck(row + 1, col, word, word.charAt(charToFind + 1)); 
          } 
          // H 
          else if (grid[row + 1][col + 1] == word.charAt(charToFind)) 
          { 
            gridCheck(row + 1, col + 1, word, 
                word.charAt(charToFind + 1)); 
          } 

        } 
        // Letter is touching top left corner 
        if (row == 0 && col == 0) 
        { 
          // E 
          if (grid[row][col + 1] == word.charAt(charToFind)) 
          { 
            gridCheck(row, col + 1, word, word.charAt(charToFind + 1)); 
          } 
          // H 
          else if (grid[row + 1][col + 1] == word.charAt(charToFind)) 
          { 
            gridCheck(row + 1, col + 1, word, 
                word.charAt(charToFind + 1)); 
          } 
          // G 
          else if (grid[row + 1][col] == word.charAt(charToFind)) 
          { 
            gridCheck(row + 1, col, word, word.charAt(charToFind + 1)); 
          } 
        } 
        // Letter is touching top Right corner 
        if (row == 0 && col == this.rowLength) 
        { 
          // D 
          if (grid[row][col - 1] == word.charAt(charToFind)) 
          { 
            gridCheck(row, col - 1, word, word.charAt(charToFind + 1)); 
          } 
          // F 
          else if (grid[row + 1][col - 1] == word.charAt(charToFind)) 
          { 
            gridCheck(row + 1, col - 1, word, 
                word.charAt(charToFind + 1)); 
          } 
          // G 
          else if (grid[row + 1][col] == word.charAt(charToFind)) 
          { 
            gridCheck(row + 1, col, word, word.charAt(charToFind + 1)); 
          } 

        } 
        // Letter is Touching bottom Left Corner 
        if (row == this.noOfRows && col == 0) 
        { 
          // B 
          if (grid[row - 1][col] == word.charAt(charToFind)) 
          { 
            gridCheck(row - 1, col, word, word.charAt(charToFind + 1)); 
          } 
          // C 
          else if (grid[row - 1][col + 1] == word.charAt(charToFind)) 
          { 
            gridCheck(row - 1, col + 1, word, 
                word.charAt(charToFind + 1)); 
          } 

          // E 
          else if (grid[row][col + 1] == word.charAt(charToFind)) 
          { 
            gridCheck(row, col + 1, word, word.charAt(charToFind + 1)); 
          } 

        } 
        // Letter is touching bottom right corner 
        if (row == this.noOfRows && col == this.rowLength) 
        { 
          // A 
          if (grid[row - 1][col - 1] == word.charAt(charToFind)) 
          { 
            gridCheck(row - 1, col - 1, word, 
                word.charAt(charToFind + 1)); 
          } 
          // B 
          else if (grid[row - 1][col] == word.charAt(charToFind)) 
          { 
            gridCheck(row - 1, col, word, word.charAt(charToFind + 1)); 
          } 
          // D 
          if (grid[row][col - 1] == word.charAt(charToFind)) 
          { 
            gridCheck(row, col - 1, word, word.charAt(charToFind + 1)); 
          } 
        } 
        // letter is on top row of grid 
        if (row == 0 && col > 0 && col < this.rowLength) 
        { 
          // D 
          if (grid[row][col - 1] == word.charAt(charToFind)) 
          { 
            gridCheck(row, col - 1, word, word.charAt(charToFind + 1)); 
          } 
          // E 
          else if (grid[row][col + 1] == word.charAt(charToFind)) 
          { 
            gridCheck(row, col + 1, word, word.charAt(charToFind + 1)); 
          } 
          // F 
          else if (grid[row + 1][col - 1] == word.charAt(charToFind)) 
          { 
            gridCheck(row + 1, col - 1, word, 
                word.charAt(charToFind + 1)); 
          } 
          // G 
          else if (grid[row + 1][col] == word.charAt(charToFind)) 
          { 
            gridCheck(row + 1, col, word, word.charAt(charToFind + 1)); 
          } 
          // H 
          else if (grid[row + 1][col + 1] == word.charAt(charToFind)) 
          { 
            gridCheck(row + 1, col + 1, word, 
                word.charAt(charToFind + 1)); 
          } 
        } 
        // Letter is on bottom row of grid 
        if (row == this.noOfRows && col > 0 && col < this.rowLength) 
        { 
          // FOR CODES SEE CHECKPLACES.TXT 
          // A 
          if (grid[row - 1][col - 1] == word.charAt(charToFind)) 
          { 
            gridCheck(row - 1, col - 1, word, 
                word.charAt(charToFind + 1)); 
          } 
          // B 
          else if (grid[row - 1][col] == word.charAt(charToFind)) 
          { 
            gridCheck(row - 1, col, word, word.charAt(charToFind + 1)); 
          } 
          // C 
          else if (grid[row - 1][col + 1] == word.charAt(charToFind)) 
          { 
            gridCheck(row - 1, col + 1, word, 
                word.charAt(charToFind + 1)); 
          } 
          // D 
          else if (grid[row][col - 1] == word.charAt(charToFind)) 
          { 
            gridCheck(row, col - 1, word, word.charAt(charToFind + 1)); 
          } 
          // E 
          else if (grid[row][col + 1] == word.charAt(charToFind)) 
          { 
            gridCheck(row, col + 1, word, word.charAt(charToFind + 1)); 
          } 
        } 
        // Letter is on Leftmost column of grid 
        if (col == 0 && row > 0 && row < this.noOfRows) 
        { 
          // B 
          if (grid[row - 1][col] == word.charAt(charToFind)) 
          { 
            gridCheck(row - 1, col, word, word.charAt(charToFind + 1)); 
          } 
          // C 
          else if (grid[row - 1][col + 1] == word.charAt(charToFind)) 
          { 
            gridCheck(row - 1, col + 1, word, 
                word.charAt(charToFind + 1)); 
          } 
          // E 
          else if (grid[row][col + 1] == word.charAt(charToFind)) 
          { 
            gridCheck(row, col + 1, word, word.charAt(charToFind + 1)); 
          } 
          // G 
          else if (grid[row + 1][col] == word.charAt(charToFind)) 
          { 
            gridCheck(row + 1, col, word, word.charAt(charToFind + 1)); 
          } 
          // H 
          else if (grid[row + 1][col + 1] == word.charAt(charToFind)) 
          { 
            gridCheck(row + 1, col + 1, word, 
                word.charAt(charToFind + 1)); 
          } 
        } 
        // Letter is on rightmost column of grid 
        if (col == this.rowLength && row > 0 && row < this.noOfRows) 
        { 
          // A 
          if (grid[row - 1][col - 1] == word.charAt(charToFind)) 
          { 
            gridCheck(row - 1, col - 1, word, 
                word.charAt(charToFind + 1)); 
          } 
          // B 
          else if (grid[row - 1][col] == word.charAt(charToFind)) 
          { 
            gridCheck(row - 1, col, word, word.charAt(charToFind + 1)); 
          } 
          // D 
          else if (grid[row][col - 1] == word.charAt(charToFind)) 
          { 
            gridCheck(row, col - 1, word, word.charAt(charToFind + 1)); 
          } 

        } 
      } 

      // If word is not found 
      return false; 
    } 

网格物体[柜面我们需要它]的构造函数如下 -

/** 
    * Constructs a new LetterGrid Object 
    * 
    * @param letterGridFile 
    *   the file to use 
    */ 
    public LetterGrid(String letterGridFile) 
    { 
      try 
      { 
        // Init Scanner 
        Scanner fileIn = new Scanner(new File(letterGridFile)); 
        // Init ArrayList 
        ArrayList<String> nextLine = new ArrayList<String>(10); 
        // Read Data 
        while (fileIn.hasNextLine()) 
        { 
          nextLine.add(fileIn.nextLine()); 
          noOfRows++; 
        } 
        fileIn.close(); 

        rowLength = nextLine.size(); 
        grid = new char[noOfRows][rowLength]; 
        // Add data to grid 
        for (int rowCount = 0; rowCount < noOfRows; rowCount++) 
        { 

          grid[rowCount] = (nextLine.get(rowCount).toCharArray()); 
        } 
      } 
      // In case file name is mistyped or nonexistent 
      catch (IOException exp) 
      { 
        System.out.println("Oops, something went wrong."); 
        System.out.println("--> File Not Found"); 
      } 

    } 

最后,参考我使用的搜索方式:

Places to check    the X = current letter to check around 
Row Col Code    A B C 
-1 -1 A 
-1  0 B    D X E 
-1  1 C 
0 -1 D    F G H 
0  1 E 
1 -1 F 
1  0 G 
1  1 H 

谢谢大家的帮助=)

-Apok

回答

0

嗯,我看到的第一件事是,我认为你的代码将在下面的数字“电脑报”:

xxxxxxcxxxxxx 
xxxxxoxxxxxxx 
xxxxxmxxxxxxx 
xxxxxxpuxxxxx 
xxxxxretxxxxx 

其中x是任意的字母。

我相信你需要实现一些东西,保留调用之间的搜索方向。

例如,如果您在网格中的某个点上找到单词“computer”的第一个字母,然后在西北方找到“o”,则您的代码应继续在NW方向上搜索直到它找到一个不在单词中的字符(或者当然,如果它碰到“墙”)

0

类似这样的东西可能会诀窍,尽管您需要添加额外的代码来限制搜索范围的网格(也是C#不是java,但几乎相同)

private Point FindWordInWordSeacrh(String word) 
    { 
     char[,] grid = new char[10, 10]; 


     for (int x = 0; x < 10; x++) 
     { 
      for (int y = 0; y < 10; y++) 
      { 
       int iWOrdCharIndex = 0; 
       if (grid[x,y] == word[iWOrdCharIndex]) 
       { 
        // if the first letter of the word is found 
        iWOrdCharIndex++; 

        // Set the direction vector to continue the search 
        for (int xDir = -1; xDir <= 1; xDir++) 
        { 
         for (int yDir = -1; yDir <= 1; yDir++) 
         { 
          // Diretion vector set so check for remaining letters of word 
          for (int iCharPos = 1; iCharPos < word.Length; iCharPos++) 
          { 
           // Check the next letters of the word along this direction vector 
           if (grid[x+xDir, y+yDir] != word[iCharPos]) 
           { 
            // break loop and chnage direction vector if looking in wrong direction 
            break; 
           } 
           else if (iCharPos == word.Length) 
           { 
            // retun the starting point if word found 
            return new Point(x, y); 
           } 
          } 
         } 
        } 
       } 

      } 
     } 
     return null; 
    }