繁体   English   中英

查找单词字母网格

[英]Find word letter grid

我正在研究Boggle游戏,并且正在创建一个名为findWord的方法,如果可以在“网格”中找到“ word”,则该方法返回true。 返回false,否则私有成员变量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;
    }


}

我看到的一个问题是您两次调用this.find(curr, row+1, col) ,第二个应该是this.find(curr, row+1, col+1) 这将使您无法对角向下/向右检查,而看不到测试用例,我无法说这是否实际上导致它总是失败。

您可能会发现这很有趣,它会水平,垂直和对角地找到单词(但不是反方向):

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在这里不支持将布尔值隐式转换为int(例如C或C ++一样-哦,C#可以吗?),否则我们可以这样写:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM