2016-07-15 8 views
0

私はBoggleのゲームに取り組んでおり、 "単語"が "グリッド"で見つかると真を返すfindWordというメソッドを作成しています。戻り値falseの場合、privateメンバー変数gridに文字グリッドがあります。しかし、私は私の主な方法を実行すると、それは "見つからない"という印字を保ち、私はどこで間違いをしたのか分かりませんでした!これは私が見単語の文字グリッドを見つける

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ループである必要があり、あなたの中に条件 'COL Gendarme

+0

補助機能の第2、第2または条件と同じです(許可された例外のみですが、良い方法ではありません:ボードのサイズが正方形であることが保証されている場合)。 – 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; 
関連する問題