2013-03-26 48 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; 
    }