2016-07-15 47 views
0

我正在研究Boggle游戏,并且我正在创建一个名为findWord的方法,如果可以在“网格”中找到“单词”,它将返回true。否则返回false私有成员变量网格具有字母网格。然而,当我运行我的主要方法时,它会一直打印出“找不到”,我无法弄清楚我犯了什么错误!这是我的代码查找单词字母网格

public class BoggleGame_old { 
    LetterGrid grid; 
    private char[][]board; 
    boolean[][] visited; 
public BoggleGame_old(LetterGrid g) 
{ 
    grid = g; 
} 
public boolean findWord(String word) { 

    for(int row=0;row<this.board.length;row++){ 
     for(int col=0;col<this.board.length;col++){ 
      if(this.find(word, row, col)){ 
       return true; 
      } 
     } 
    } 
    return false; 
} 
    //helping function 
    private boolean find(String word, int row, int col){ 
    if(word.equals("")) 
    { 
     return true; 
    } 
    else if(row<0||row>=this.board.length|| 

      col<0||col>=this.board.length|| 
      this.board[row][col] != word.charAt(0)) 
    { 
     return false; 

    } 
    else{ 
     char c=this.board[row][col]; 
     this.board[row][col]='*'; 
     String curr=word.substring(1,word.length()); 
     boolean res=this.find(curr, row-1, col-1)|| 
       this.find(curr, row-1, col)|| 
       this.find(curr, row-1, col+1)|| 
       this.find(curr, row, col-1)|| 
       this.find(curr, row, col+1)|| 
       this.find(curr, row+1, col-1)|| 
       this.find(curr, row+1, col)|| 
       this.find(curr, row+1, col); 
      this.board[row][col]=c; 
      return res; 
    } 


} 
+0

在你内心的for循环应该是条件'山坳 Gendarme

+0

同样的第二,如果,第二或帮助功能条件(只允许例外,但不是良好的做法:如果董事会保证有方形大小)。 – Aconcagua

回答

0

一个问题我看到的是,你打电话this.find(curr, row+1, col)两次,第二个应该是this.find(curr, row+1, col+1)。它会阻止你无法查看测试用例,如果这实际上导致它总是失败,可以对角地向下/向右查看。

0

您可能会发现这个有趣的,它水平找到的话,垂直和对角线(而不是相反方向):

public boolean findWord(String word) 
{ 
    if(word == null || word.isEmpty()) 
     return true; 
    int rowMax = board.length - word.length(); 
    int colMax = board[0].length - word.length(); 
    if(rowMax < 0 || colMax < 0) 
     return false; 
    for (int row = 0; row < rowMax; ++row) 
    { 
     for (int col = 0; col < colMax; ++col) 
     { 
      boolean v = true; 
      boolean h = true; 
      boolean d = true; 
      for(int c = 0; c < word.length(); ++c) 
      { 
       v &= board[row + c][col] == word.charAt(c); 
       h &= board[row][col + c] == word.charAt(c); 
       d &= board[row + c][col + c] == word.charAt(c); 
       if(!(v | h | d)) 
        break; 
      } 
      if(v|h|d) 
       return true; 
     } 
    } 
    return false; 
} 

编辑:变找到方向相反的字符串,太:

public boolean findWord(String word) 
{ 
    if(word == null || word.isEmpty()) 
     return true; 
    int rowMax = board.length - word.length(); 
    int colMax = board[0].length - word.length(); 
    if(rowMax < 0 || colMax < 0) 
     return false; 
    StringBuilder reverse = new StringBuilder(word).reverse(); 
    for (int row = 0; row < rowMax; ++row) 
    { 
     for (int col = 0; col < colMax; ++col) 
     { 
      boolean v = true; 
      boolean h = true; 
      boolean d = true; 
      boolean rv = true; 
      boolean rh = true; 
      boolean rd = true; 
      for(int c = 0; c < word.length(); ++c) 
      { 
       v &= board[row + c][col] == word.charAt(c); 
       h &= board[row][col + c] == word.charAt(c); 
       d &= board[row + c][col + c] == word.charAt(c); 
       rv &= board[row + c][col] == reverse.charAt(c); 
       rh &= board[row][col + c] == reverse.charAt(c); 
       rd &= board[row + c][col + c] == reverse.charAt(c); 
       if(!(v | h | d | rv | rh | rd)) 
        break; 
      } 
      if(v | h | d | rv | rh | rd) 
       return true; 
     } 
    } 
    return false; 
} 

编辑2:这么多布尔... –有点紧凑:

int flags = 0; 
for(int c = 0; flags != 0b111111 && c < word.length(); ++c) 
{ 
    flags |= board[row + c][col ] == word.charAt(c) ? 0 : 1 << 0; 
    flags |= board[row ][col + c] == word.charAt(c) ? 0 : 1 << 1; 
    flags |= board[row + c][col + c] == word.charAt(c) ? 0 : 1 << 2; 
    flags |= board[row + c][col ] == reverse.charAt(c) ? 0 : 1 << 3; 
    flags |= board[row ][col + c] == reverse.charAt(c) ? 0 : 1 << 4; 
    flags |= board[row + c][col + c] == reverse.charAt(c) ? 0 : 1 << 5; 
} 
if(flags != 0b111111) 
    return true; 

只是遗憾的是,Java不支持在这里隐式地将boolean转换为int(比如e。 G。 C或C++做–哦,顺便说一句,不C#),否则我们可以这样写:

flags |= (a == b) << n;