0

我知道这是一篇很长而且可能令人困惑的帖子……但我真的不知道是什么原因造成的……所以我尽我所能解释。我不知道如何简洁地描述这个问题,这让我很难寻找其他解决方案。

无论如何,首先是一点背景。该程序在所有可能的 8 个方向上读取 2D 数组以查找单词(该程序基本上是一个自动单词查找)。

我有二维数组,我正在搜索它,寻找给定的字符串。为此,我有 3 个循环:

  • 第一个循环(循环 x)选择起始 x 坐标
  • 第二个循环(循环 y)选择起始 y 坐标
  • 最后一个循环(循环 L)从外部循环的 (x,y) 坐标给定的位置开始检查长度为 L 的单词。

但是,在外部循环增加到 1 之前,程序似乎不会进入 L 的循环。因此,我无法开始在第 1 列(x = 0)中搜索单词,第一个被访问的是第 2 列 (x=1)。当其他两个循环中的任何一个的值低于 1 时,就好像有一个 if 语句阻止 for 循环运行。更重要的是,这只发生在我减去数组的索引位置时,而不是当我添加它们时。

为了澄清最后一点,我通过一次将字符添加到字符串来搜索单词。因此,当向前阅读时,三个字母的单词 'cat' 将由位置 x 处的字符串 'c' 组成,然后我们在位置 x+1 处将 char 'a' 添加到字符串中,然后在该字符串中添加 char ' t' 来自位置 x+2。这基本上写为 arr[x+L][y],用于向前搜索一个单词。但是,我也想找到倒写的单词。所以为此我有一个循环添加arr [xL] [y]。似乎这个错误只发生在我从数组中的索引中减去 L 时,并且只发生在减去它的值上(所以对于 [x-1][y],x=0 不会进入for 循环,但 y=0 可以。

这是(缩短的)代码:

public void searchPuzzle(String[][] Puzzle){

    //For Each Coordinate X,Y
    for(int x=0; x<Puzzle.length; x++){//For each x position

        for(int y=0; y<Puzzle[x].length; y++){//For each y position

            //RESET or INITAITE strings for searching in all 8 directions
            String F="", B="", U="", D="", DiFU="", DiFD="", DiBU="", DiBD="";

            //SEARCH FORWARD
            for(int L = 0; L < Puzzle.length-x; L++){ //search for word of length L
                F = F+Puzzle[x+L][y];
                //System.out.println(F);
                if(isWord(F)){
                    //System.out.println(F);
                }
            }


            //SEARCH BACK 
            System.out.println("X:" + x + " Y: "+y);
            for(int L = 0; L < x; L++){ //search for word of
                System.out.println("X:" + x + " Y: "+y);
                B = B+Puzzle[x-L][y];
                System.out.println(B);
                if(isWord(B)){
                    //System.out.println(B);
                }
            }
            System.out.println("--");

            //SEARCH DIAGONALLY - BACK & UP
            for(int L = 0; L < smaller(x,y); L++){
                DiBU = DiBU+Puzzle[x-L][y-L];
                if(isWord(DiBU)){
                    //System.out.println(DiBU);
                }
            }    
  • 向前搜索

完美运行(因为 F+Puzzle[x+L][y] 只涉及加法)。所以对于这个程序,它应该从 arr[0][0] 开始读取。

  • 搜索返回

有我提到的错误,但只有x值是错误的。这意味着 x=0 永远不会被传递到循环 SEARCH BACK 中,因此循环以 x=1 开始。请注意,代码有 B+Puzzle[xL][y] 所以对于这个程序,程序从 arr[1][0] 开始读取。

  • 搜索对角线 - 备份和向上

x 和 Y 都有这个错误。由于“DiBU+Puzzle[xL][yL]”,x=0 和 y=0 都不会进入循环。所以对于这个程序,程序从 arr[1][1] 开始阅读。

编辑:我尝试简单地减去 1(如在 B+Puzzle[xL-1][y] 中),但这只会导致它从正确的位置开始,但会缩短一列。

TL;DR 除非外部两个循环的值大于 0,否则无法读取三个 for 循环的最内层。但只有当我从所述最内层 For 循环内的数组索引中减去值时,才会出现此问题。

4

2 回答 2

1

我认为将前向和后向搜索分开会更简单,至少在您完成所有工作之前是这样。一次只做一件事,并且认真地去做。

如果 x 为零,则不执行第二个循环的任何迭代的原因在于循环条件:

  for(int L = 0; L < x; L++)

L 永远不会小于 0,因此如果 x 为 0,则永远不会满足条件 L < x,并且循环执行零次迭代。

假设 y 为 0,x 为 2。元素 [2][0]、[1][0] 和 [0][0] 可以是三个字母的单词。对于 L=0 和 L=1,您将只进行两次迭代。

这两个问题都可以通过将条件更改为 L <= x 再进行一次迭代来解决。

考虑循环条件非常非常重要。在许多简单的情况下,“<”测试是合适的,但并非总是如此。在这种情况下, L==x 会导致查看您想要的数组的元素 0。

于 2012-11-05T09:52:32.700 回答
0

我认为有一个逻辑问题:

       //SEARCH BACK 
        for(int L = 0; L < x; L++){ //search for word of
            B = B+Puzzle[x-L][y];
            //System.out.println(B);
            if(isWord(B)){
                //System.out.println(B);
            }
        }

如果单词CATTAC在矩阵的开头,您将找不到它。也许你想做:

       //SEARCH BACK 
        for(int L = Puzzle.length-x - 1; L >=0 ; L--){ 
            B = B+Puzzle[L-x][y];
            //System.out.println(B);
            if(isWord(B)){
                //System.out.println(B);
            }
        }

那么,你为什么要向后搜索???每次向前搜索时,您都可以在另一侧连接一个单词。意思是 :

       String forwardword;
       String backwardword; 
       for(int L = 0; L < Puzzle.length-x; L++){ //search for word of length L
            forwardword = forwardword +Puzzle[x+L][y];
            backwardword = Puzzle[x+L][y] + backwardword; // <<HERE

            if(isWord(forwardword)){
                //System.out.println(forwardword);
            }
            if(isWord(backwardword)){
                //System.out.println(backwardword);
            }                

        }
于 2012-11-05T09:03:28.850 回答