-2

所以我必须为类制作一个单词搜索程序,对于其中的某些部分,它工作正常,但过了一段时间它停止打印出所有字符串。我不知道为什么......任何帮助都会很棒!

void checkWords(char** search, char** dictionary, int rows, int col){

    const int DX_SIZE =8;
    const int DX[] = {-1,-1,-1, 0,0, 1,1,1};
    const int DY[] = {-1, 0, 1,-1,1,-1,0,1};
    int X = 0;
    int Y = 0;
    int i,j,k;
    int dir=0;
    int curX = X;
    int curY = Y;
          for(j=0;j<rows;j++){
                  Y++;
          for(k=0;k<col;k++){
                  X++;
          for(dir=0;dir<DX_SIZE;dir++){
                  char word[20] = {'\0'};
          for(i=0;i<=19;i++){
                  int curX= ((X+DX[dir]*i)-1);
                  int curY=((Y+DY[dir]*i)-1);
                  if(curY>=0&&curY<rows){
                      if(curX>=0&&curX<col){
                           word[i]=search[curX][curY];
                           printf("Stage 7 curX:%d, curY:%d, i:%d dir:%d word:%s\n", curX, curY, i, dir, word);
            }
        }

       int bin=bSearch(word, dictionary, 0, words());
            if(bin==1){
               // printf("%s\n", word);
            }
          }
          }
          }
          }
}

提前感谢任何帮助的人!

编辑:

这是一些输出示例:http: //imgur.com/a/zo0fS 输出一切正常,直到它开始不打印单词...

编辑2:4

4

喜欢

喜欢

阶段 7 curX:0, curY:0, i:0 dir:0 word:b

阶段 7 curX:0, curY:0, i:0 dir:1 word:b

阶段 7 curX:0, curY:0, i:0 dir:2 word:b

阶段 7 curX:0, curY:0, i:0 dir:3 word:b

阶段 7 curX:0, curY:0, i:0 dir:4 word:b

阶段 7 curX:0, curY:1, i:1 dir:4 word:bo

阶段 7 curX:0, curY:2, i:2 dir:4 word:boa

阶段 7 curX:0, curY:3, i:3 dir:4 word:boat

阶段 7 curX:0, curY:0, i:0 dir:5 word:b

阶段 7 curX:0, curY:0, i:0 dir:6 word:b

阶段 7 curX:1, curY:0, i:1 dir:6 word:bl

阶段 7 curX:2, curY:0, i:2 dir:6 word:blc

阶段 7 curX:3, curY:0, i:3 dir:6 word:blcl

阶段 7 curX:0, curY:0, i:0 dir:7 word:b

第 7 阶段 curX:1, curY:1, i:1 dir:7 word:bi

阶段 7 curX:2, curY:2, i:2 dir:7 word:bim

阶段 7 curX:3, curY:3, i:3 dir:7 word:bime

阶段 7 curX:1, curY:0, i:0 dir:0 word:l

阶段 7 curX:1, curY:0, i:0 dir:1 word:l

阶段 7 curX:0, curY:0, i:1 dir:1 word:lb

阶段 7 curX:1, curY:0, i:0 dir:2 word:l

阶段 7 curX:0, curY:1, i:1 dir:2 word:lo

阶段 7 curX:1, curY:0, i:0 dir:3 word:l

阶段 7 curX:1, curY:0, i:0 dir:4 word:l

阶段 7 curX:1, curY:1, i:1 dir:4 word:li

阶段 7 curX:1, curY:2, i:2 dir:4 word:lik

阶段 7 curX:1, curY:3, i:3 dir:4 word:like

阶段 7 curX:1, curY:0, i:0 dir:5 word:l

阶段 7 curX:1, curY:0, i:0 dir:6 word:l

阶段 7 curX:2, curY:0, i:1 dir:6 word:lc

阶段 7 curX:3, curY:0, i:2 dir:6 word:lcl

阶段 7 curX:1, curY:0, i:0 dir:7 word:l

阶段 7 curX:2, curY:1, i:1 dir:7 word:la

阶段 7 curX:3, curY:2, i:2 dir:7 word:lak

阶段 7 curX:2, curY:0, i:0 dir:0 word:c

阶段 7 curX:2, curY:0, i:0 dir:1 word:c

阶段 7 curX:1, curY:0, i:1 dir:1 word:cl

阶段 7 curX:0, curY:0, i:2 dir:1 word:clb

阶段 7 curX:2, curY:0, i:0 dir:2 word:c

阶段 7 curX:1, curY:1, i:1 dir:2 word:ci

阶段 7 curX:0, curY:2, i:2 dir:2 word:cia

阶段 7 curX:2, curY:0, i:0 dir:3 word:c

阶段 7 curX:2, curY:0, i:0 dir:4 word:c

阶段 7 curX:2, curY:1, i:1 dir:4 word:ca

阶段 7 curX:2, curY:2, i:2 dir:4 word:cam

阶段 7 curX:2, curY:3, i:3 dir:4 word:camp

阶段 7 curX:2, curY:0, i:0 dir:5 word:c

阶段 7 curX:2, curY:0, i:0 dir:6 word:c

阶段 7 curX:3, curY:0, i:1 dir:6 word:cl

阶段 7 curX:2, curY:0, i:0 dir:7 word:c

阶段 7 curX:3, curY:1, i:1 dir:7 word:ci

阶段 7 curX:3, curY:0, i:0 dir:0 word:l

阶段 7 curX:3, curY:0, i:0 dir:1 word:l

阶段 7 curX:2, curY:0, i:1 dir:1 word:lc

阶段 7 curX:1, curY:0, i:2 dir:1 word:lcl

阶段 7 curX:0, curY:0, i:3 dir:1 word:lclb

阶段 7 curX:3, curY:0, i:0 dir:2 word:l

阶段 7 curX:2, curY:1, i:1 dir:2 word:l

阶段 7 curX:1, curY:2, i:2 dir:2 word:lak

阶段 7 curX:0, curY:3, i:3 dir:2 word:lakt

阶段 7 curX:3, curY:0, i:0 dir:3 word:l

阶段 7 curX:3, curY:0, i:0 dir:4 word:l

阶段 7 curX:3, curY:1, i:1 dir:4 word:li

阶段 7 curX:3, curY:2, i:2 dir:4 word:lik

阶段 7 curX:3, curY:3, i:3 dir:4 word:like

阶段 7 curX:3, curY:0, i:0 dir:5 word:l

阶段 7 curX:3, curY:0, i:0 dir:6 word:l

阶段 7 curX:3, curY:0, i:0 dir:7 word:l

阶段 7 curX:3, curY:0, i:1 dir:0 word:

阶段 7 curX:3, curY:1, i:1 dir:1 word:

阶段 7 curX:2, curY:1, i:2 dir:1 word:

阶段 7 curX:1, curY:1, i:3 dir:1 word:

阶段 7 curX:0, curY:1, i:4 dir:1 word:

阶段 7 curX:3, curY:2, i:1 dir:2 word:

阶段 7 curX:2, curY:3, i:2 dir:2 word:

阶段 7 curX:3, curY:1, i:2 dir:1 word:

阶段 7 curX:2, curY:1, i:3 dir:1 word:

阶段 7 curX:1, curY:1, i:4 dir:1 word:

阶段 7 curX:0, curY:1, i:5 dir:1 word:

阶段 7 curX:3, curY:3, i:2 dir:2 word:

阶段 7 curX:3, curY:1, i:3 dir:1 word:

阶段 7 curX:2, curY:1, i:4 dir:1 word:

阶段 7 curX:1, curY:1, i:5 dir:1 word:

阶段 7 curX:0, curY:1, i:6 dir:1 word:

阶段 7 curX:3, curY:1, i:4 dir:1 word:

阶段 7 curX:2, curY:1, i:5 dir:1 word:

阶段 7 curX:1, curY:1, i:6 dir:1 word:

阶段 7 curX:0, curY:1, i:7 dir:1 word:

阶段 7 curX:3, curY:2, i:5 dir:1 word:

阶段 7 curX:2, curY:2, i:6 dir:1 word:

阶段 7 curX:1, curY:2, i:7 dir:1 word:

阶段 7 curX:0, curY:2, i:8 dir:1 word:

阶段 7 curX:3, curY:2, i:6 dir:1 word:

阶段 7 curX:2, curY:2, i:7 dir:1 word:

阶段 7 curX:1, curY:2, i:8 dir:1 word:

阶段 7 curX:0, curY:2, i:9 dir:1 word:

阶段 7 curX:3, curY:2, i:7 dir:1 word:

阶段 7 curX:2, curY:2, i:8 dir:1 word:

阶段 7 curX:1, curY:2, i:9 dir:1 word:

阶段 7 curX:0, curY:2, i:10 dir:1 word:

阶段 7 curX:3, curY:2, i:8 dir:1 word:

阶段 7 curX:2, curY:2, i:9 dir:1 word:

阶段 7 curX:1, curY:2, i:10 dir:1 word:

阶段 7 curX:0, curY:2, i:11 dir:1 word:

进程返回 0 (0x0) 执行时间:8.528 s 按任意键继续。

4

1 回答 1

1

您的代码有几个问题:

  • X在内部循环中递增,这意味着它是递增col*rows的次数,很快越界条件(幸好检查)为真。X每次递增时都应该重置Y。当你这样做时,Y总是j + 1X总是k + 1。计算位置时,通过减去 1 再次“调整”值。去掉jandk并使用YandX作为循环变量并直接使用它们。

  • 你声明DXDY两次。内部声明是唯一活跃的声明,它遮蔽了外部声明。摆脱外部的。

  • C 中的二维数组以行作为第一个索引,列作为第二个索引存储。应该是search[curY][curX]

  • 您可能想要查找所有中间词,而不仅仅是包含 19 个字母的词。将二分搜索放在内部循环中。

  • 不是错误,而是观察:一旦超出范围,所有较长的单词也将超出范围。在这种情况下,您可以缩短循环。

这是解决这些问题的版本:

void checkWords(char **search, char **dictionary, int rows, int col)
{

    const int DX_SIZE = 8;
    const int DX[] = { -1, -1, -1,  0, 0,  1, 1, 1 };
    const int DY[] = { -1,  0,  1, -1, 1, -1, 0, 1 };
    int i, X, Y;
    int dir = 0;

    for (Y = 0; Y < rows; Y++) {
        for (X = 0; X < col; X++) {
            for (dir = 0; dir < DX_SIZE; dir++) {
                char word[20] = { '\0' };

                for (i = 0; i < 19; i++) {
                    int curX = X + DX[dir] * i;
                    int curY = Y + DY[dir] * i;

                    if (curY < 0 || curY >= rows) break;
                    if (curX < 0 || curX >= col) break;

                    word[i] = search[curY][curX];

                    if (i > 2) {
                        int bin = bSearch(word, dictionary, 0, words());

                        if (bin) printf("%s\n", word);
                    }
                }
            }
        }
    }
}
于 2016-01-30T18:22:09.613 回答