所以我必须为类创建一个单词搜索程序,对于它的某些部分,它工作正常,但过了一段时间它会停止一起打印字符串。我不知道为什么......任何帮助都会很棒!
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 输出结果一直很好,直到它开始没有打印出来......
EDIT2: 4
4
船
像
营
像
第7阶段curX:0,curY:0,i:0 dir:0 word:b
第7阶段curX:0,curY:0,i:0 dir:1个字:b
第7阶段curX:0,curY:0,i:0 dir:2个字:b
第7阶段curX:0,curY:0,i:0 dir:3个字:b
第7阶段curX:0,curY:0,i:0 dir:4个字:b
第7阶段curX:0,curY:1,i:1 dir:4个字:bo
第7阶段curX:0,curY:2,i:2 dir:4个字:boa
阶段7 curX:0,curY:3,i:3 dir:4个字:boat
第7阶段curX:0,curY:0,i:0 dir:5个字:b
第7阶段curX:0,curY:0,i:0 dir:6字:b
第7阶段curX:1,curY:0,i:1 dir:6个字:bl
第7阶段curX:2,curY:0,i:2 dir:6个字:blc
第7阶段curX:3,curY:0,i:3 dir:6字:blcl
第7阶段curX:0,curY:0,i:0 dir:7字:b
第7阶段curX:1,curY:1,i:1 dir:7个字:bi
第7阶段curX:2,curY:2,i:2 dir:7字:bim
第7阶段curX:3,curY:3,i:3 dir:7字:bime
第7阶段curX:1,curY:0,i:0 dir:0 word:l
第7阶段curX:1,curY:0,i:0 dir:1个字:l
第7阶段curX:0,curY:0,i:1 dir:1个字:lb
第7阶段curX:1,curY:0,i:0 dir:2字:l
第7阶段curX:0,curY:1,i:1 dir:2个字:lo
第7阶段curX:1,curY:0,i:0 dir:3个字:l
第7阶段curX:1,curY:0,i:0 dir:4个字:l
第7阶段curX:1,curY:1,i:1 dir:4个字:li
第7阶段curX:1,curY:2,i:2 dir:4个字:lik
第7阶段curX:1,curY:3,i:3 dir:4个字:喜欢
第7阶段curX:1,curY:0,i:0 dir:5个字:l
第7阶段curX:1,curY:0,i:0 dir:6字:l
第7阶段curX:2,curY:0,i:1 dir:6字:lc
第7阶段curX:3,curY:0,i:2 dir:6字:lcl
第7阶段curX:1,curY:0,i:0 dir:7字:l
第7阶段curX:2,curY:1,i:1 dir:7字:la
第7阶段curX:3,curY:2,i:2 dir:7个字:lak
第7阶段curX:2,curY:0,i:0 dir:0 word:c
第7阶段curX:2,curY:0,i:0 dir:1个字:c
第7阶段curX:1,curY:0,i:1 dir:1个字:cl
第7阶段curX:0,curY:0,i:2 dir:1个字:clb
第7阶段curX:2,curY:0,i:0 dir:2个字:c
第7阶段curX:1,curY:1,i:1 dir:2个字:ci
第7阶段curX:0,curY:2,i:2 dir:2个词:cia
第7阶段curX:2,curY:0,i:0 dir:3个字:c
第7阶段curX:2,curY:0,i:0 dir:4个字:c
第7阶段curX:2,curY:1,i:1 dir:4个字:ca
第7阶段curX:2,curY:2,i:2 dir:4个字:cam
第7阶段curX:2,curY:3,i:3 dir:4个字:camp
第7阶段curX:2,curY:0,i:0 dir:5个字:c
第7阶段curX:2,curY:0,i:0 dir:6个字:c
第7阶段curX:3,curY:0,i:1 dir:6个字:cl
第7阶段curX:2,curY:0,i:0 dir:7字:c
第7阶段curX:3,curY:1,i:1 dir:7字:ci
第7阶段curX:3,curY:0,i:0 dir:0 word:l
第7阶段curX:3,curY:0,i:0 dir:1个字:l
第7阶段curX:2,curY:0,i:1 dir:1个字:lc
第7阶段curX:1,curY:0,i:2 dir:1个词:lcl
第7阶段curX:0,curY:0,i:3 dir:1个词:lclb
第7阶段curX:3,curY:0,i:0 dir:2个字:l
第7阶段curX:2,curY:1,i:1 dir:2个字:l
第7阶段curX:1,curY:2,i:2 dir:2个字:lak
第7阶段curX:0,curY:3,i:3 dir:2个字:lakt
第7阶段curX:3,curY:0,i:0 dir:3个字:l
第7阶段curX:3,curY:0,i:0 dir:4字:l
第7阶段curX:3,curY:1,i:1 dir:4个字:li
第7阶段curX:3,curY:2,i:2 dir:4个字:lik
第7阶段curX:3,curY:3,i:3 dir:4个字:喜欢
第7阶段curX:3,curY:0,i:0 dir:5个字:l
第7阶段curX:3,curY:0,i:0 dir:6字:l
第7阶段curX:3,curY:0,i:0 dir:7字:l
第7阶段curX:3,curY:0,i:1 dir:0字:
第7阶段curX:3,curY:1,i:1 dir:1个字:
第7阶段curX:2,curY:1,i:2 dir:1个字:
第7阶段curX:1,curY:1,i:3 dir:1个字:
第7阶段curX:0,curY:1,i:4 dir:1个字:
第7阶段curX:3,curY:2,i:1 dir:2个字:
第7阶段curX:2,curY:3,i:2 dir:2个字:
第7阶段curX:3,curY:1,i:2 dir:1个字:
第7阶段curX:2,curY:1,i:3 dir:1个字:
第7阶段curX:1,curY:1,i:4 dir:1个字:
第7阶段curX:0,curY:1,i:5 dir:1个字:
第7阶段curX:3,curY:3,i:2 dir:2个字:
第7阶段curX:3,curY:1,i:3 dir:1个字:
第7阶段curX:2,curY:1,i:4 dir:1个字:
第7阶段curX:1,curY:1,i:5 dir:1个字:
第7阶段curX:0,curY:1,i:6 dir:1个字:
第7阶段curX:3,curY:1,i:4 dir:1个字:
第7阶段curX:2,curY:1,i:5 dir:1个字:
第7阶段curX:1,curY:1,i:6 dir:1个字:
第7阶段curX:0,curY:1,i:7 dir:1个字:
第7阶段curX:3,curY:2,i:5 dir:1个字:
第7阶段curX:2,curY:2,i:6 dir:1个字:
第7阶段curX:1,curY:2,i:7 dir:1个字:
第7阶段curX:0,curY:2,i:8 dir:1个字:
第7阶段curX:3,curY:2,i:6 dir:1个字:
第7阶段curX:2,curY:2,i:7 dir:1个字:
第7阶段curX:1,curY:2,i:8 dir:1个字:
第7阶段curX:0,curY:2,i:9 dir:1个字:
第7阶段curX:3,curY:2,i:7 dir:1个字:
第7阶段curX:2,curY:2,i:8 dir:1个字:
第7阶段curX:1,curY:2,i:9 dir:1个字:
第7阶段curX:0,curY:2,i:10 dir:1个字:
第7阶段curX:3,curY:2,i:8 dir:1个字:
第7阶段curX:2,curY:2,i:9 dir:1个字:
第7阶段curX:1,curY:2,i:10 dir:1个字:
第7阶段curX:0,curY:2,i:11 dir:1个字:
进程返回0(0x0)执行时间:8.528秒 按任意键继续。
答案 0 :(得分:1)
您的代码存在一些问题:
你在内部循环中增加X
,这意味着它增加了col*rows
次,很快就会出现越界条件(你值得一试)。每次增加X
时都应重置Y
。执行此操作时,Y
始终为j + 1
,X
始终为k + 1
。在计算头寸时,您需要调整&#34;通过减去1.再次取消值。摆脱j
和k
并使用Y
和X
作为循环变量并直接使用它们。
您声明DX
和DY
两次。内部声明是唯一有效的声明,它会影响外部声明。摆脱外面的。
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);
}
}
}
}
}
}