在matlab中解决一个单词搜索难题

在matlab中解决一个单词搜索难题,matlab,octave,Matlab,Octave,发布我的全部代码,希望有人能帮我调试这些垃圾。我真的希望能很快得出结论,因为我已经玩弄这个太久了 我这里有一个函数提取,它是从我的wordsearch函数中传递一个表示字母(即a=1,Z=26)的整数网格的。给定一个方向和一个由整数行向量表示的目标单词,它应该在网格中迭代以找到第一个字母的位置,并从这里向各个方向移动单词的长度,然后提取单词,例如,如果我们正在查找[14,5,9,2],并且14首先位于(4,4),我们应该在(4,8)处结束 然后在搜索函数中比较单词,如果它与目标单词匹配,则在实际

发布我的全部代码,希望有人能帮我调试这些垃圾。我真的希望能很快得出结论,因为我已经玩弄这个太久了

我这里有一个函数提取,它是从我的wordsearch函数中传递一个表示字母(即a=1,Z=26)的整数网格的。给定一个方向和一个由整数行向量表示的目标单词,它应该在网格中迭代以找到第一个字母的位置,并从这里向各个方向移动单词的长度,然后提取单词,例如,如果我们正在查找[14,5,9,2],并且14首先位于(4,4),我们应该在(4,8)处结束

然后在搜索函数中比较单词,如果它与目标单词匹配,则在实际单词搜索的图像上从第一个字母到最后一个字母画一条线

我知道我的if和for循环在某些地方是关闭的,但我发现很难纠正我的代码以使其正常工作。救命啊!有一件事我特别难以控制,那就是控制流量,这样在检查了包含第一个字母的正方形的所有方向后,该字母的下一个实例将被计算。在哪里做这件事最好

代码本身有很多错误,可能需要几个指针告诉我在哪里需要修改或清理

%//A function to find a word in a grid.
function test = extract(grid, direction, target) 

%//switch through different cases that allow us to move to any adjacent cell to the current    
switch upper(direction)
    case 1 
        rowdir = -1; 
        coldir = 0; 
    case 2 
        rowdir = -1; 
        coldir = 1; 
    case 3 
        rowdir = 0; 
        coldir = 1; 
    case 4 
        rowdir = 1; 
        coldir = 1; 
    case 5 
        rowdir = 1; 
        coldir = 0; 
    case 6 
        rowdir = 1; 
        coldir = -1; 
    case 7 
        rowdir = 0; 
        coldir = -1; 
    case 8 
        rowdir = -1; 
        coldir = -1;  
end

[i, j] = size(grid); 
len = length(target); 
[row,column] = find(target(1)==grid); %//find the letter of the word we are looking for in grid
%//row and column of last letter having moved in a particular direction
rowN = row + (len-1) * rowdir; 
colN = column + (len-1) * coldir; 

%//trying to say here to only move in a particular direction if we don't go out of bounds. 
%//not sure I've succeeded
if (rowN > 1) | (rowN < i) | (colN > 1) | (colN < j) 
     testword = []; %empty array created
    for index = 1:len 
        index_1 = index-1;
        %//on loop get the letter in adjacent cell for direction we have moved
        word = grid(row + (index_1 * rowdir), column + (index_1 * coldir)); 
        testword{index} = word; %//letters are appended to create word for which we compare.
        %//get co-ords of start letter. change to pixel  co-ordinates so we can evaluate on image
        wordstart = [(row*30)-15, (column*30)-15 ]; 
        wordend = [((row + (len-1 * rowdir))*30)-15, ((column + (len-1 * coldir))*30)-15];
    end 
else
    word = '';
end 

  x1 = wordstart(1);
  x2 = wordend(1);
  y1 = wordstart(2);
  y2 = wordend(2);

  test = [ word , [x1,x2] , [y1,y2]]; %//only way I could think of to get all of these as outputs

end

@丹

我的提取函数现在看起来像:

[i, j] = size(grid);
len = length(target); 
[row,column] = find(target(1)==grid);
for ii = 1:length(row)
    start_row = row(ii);
    start_column = column(ii); 
    rowN = start_row + len-1 * rowdir; 
    colN = start_column + len-1 * coldir; 
    if (rowN > 1) || (rowN < i) || (colN > 1) || (colN < j) 
        testword = [];
        for index = 1:len
        index_1 = index-1;
        word = grid(start_row + (index_1 * rowdir), start_column + (index_1 * coldir));
        testword{index} = word;
        wordstart = [(start_row*30)-15, (start_column*30)-15 ];
        wordend = [((start_row + (len-1 * rowdir))*30)-15, ((start_column + (len-1 * coldir))*30)-15];
        end 
    else

    end
end 
[i,j]=尺寸(网格);
len=长度(目标);
[行,列]=查找(目标(1)=网格);
对于ii=1:长度(行)
起始行=第(ii)行;
起始列=第(二)列;
rowN=开始_行+len-1*rowdir;
colN=start_列+len-1*coldir;
如果(rowN>1)| |(rowN1)| |(colN
如果在那个特定的方向上,previous会带你出界,我会用什么作为else语句来检查单词

for iword = 1 : length(words) 
    target = char(words(iword)) - 'a' + 1;
    for i = 1:row 
        for j = 1:column 
            for direction_num = 1:8 %//for each direction
对于每个单词,您都在网格中的每个元素中循环(即
i
j
循环),但您实际上从未使用过这些
i
j
值。所以这两个循环没有任何作用!这是因为您似乎在
extract
函数中完成了所有这些操作。所以放下这两个循环,它们浪费了太多的时间

extract
函数中,有一行
[行,列]=find…
。这将找到所有可能的起点。所以你实际上需要在某个地方通过这两个循环。因此,与您的
if(rowN>1)|(rowN1)|(colN
不同,我建议您做一些更类似的事情:

for ii = 1:length(row)
    start_row = row(ii);
    start_column = column(ii); 
    %// And now re-use your code, but swap out all your row for start_row and your column for start_column
    .
    .
    .
end

这就是将遍历每个可能的起始字母的循环。

有许多方法可以获得所有输出,例如,制作一个结构(
test.word=word;test.x=[x1,x2]…
),或者使用多个输出:
函数[word,x,Y]=提取(网格,方向,目标)
然后在函数的末尾有
X=[x1,x2]
非常好,谢谢!我现在已经实现了这些更改,但由于某种原因,当我确信代码应该正常工作时,我收到了越界错误。我不认为它每次都在尝试新的方向。列表中的第一个单词是“Barry”,我让它返回网格中B所在位置的坐标只是为了检查,但我得到的结果是:尝试访问网格(0,4);索引必须是正整数或逻辑索引。提取错误(第42行)word=grid(起始行+(索引1*rowdir),起始列+(索引1*coldir))@用户3058703但是是的,那是因为如果在边缘附近有一个
B
,你仍然在将它与经过边缘的单词进行比较。我的建议是用非字母字符填充网格,像
“*”
例如,根据最长单词的字符数围绕所有边。提取函数的for循环中的if语句阻止您在给定方向上搜索,如果向该方向移动会使您出界,那么我只需要在else语句中说一些类似try next的话方向,但不确定如何实现。@user3058703在
提取
函数的
for
循环中没有
if
语句。但是如果您将
if(rowN>1)|(rowN1)|(colN
行保留在中(但是现在将
更改为
|
s,因为您正在处理标量)然后它为你检查边界并继续为你移动…?所以我期望发生的是,例如,如果在第2列和第5行发现第一个B,并且单词是“Barry”,它不应该向北或东北移动,因为这些方向上的单词*列方向的长度小于1,所以应该尝试下一个方向。如果没有成功,那么下一个等等,直到所有人都尝试过,在这种情况下,尝试下一次出现的那封信。
for ii = 1:length(row)
    start_row = row(ii);
    start_column = column(ii); 
    %// And now re-use your code, but swap out all your row for start_row and your column for start_column
    .
    .
    .
end