在matlab中解决一个单词搜索难题
发布我的全部代码,希望有人能帮我调试这些垃圾。我真的希望能很快得出结论,因为我已经玩弄这个太久了 我这里有一个函数提取,它是从我的wordsearch函数中传递一个表示字母(即a=1,Z=26)的整数网格的。给定一个方向和一个由整数行向量表示的目标单词,它应该在网格中迭代以找到第一个字母的位置,并从这里向各个方向移动单词的长度,然后提取单词,例如,如果我们正在查找[14,5,9,2],并且14首先位于(4,4),我们应该在(4,8)处结束 然后在搜索函数中比较单词,如果它与目标单词匹配,则在实际单词搜索的图像上从第一个字母到最后一个字母画一条线 我知道我的if和for循环在某些地方是关闭的,但我发现很难纠正我的代码以使其正常工作。救命啊!有一件事我特别难以控制,那就是控制流量,这样在检查了包含第一个字母的正方形的所有方向后,该字母的下一个实例将被计算。在哪里做这件事最好 代码本身有很多错误,可能需要几个指针告诉我在哪里需要修改或清理在matlab中解决一个单词搜索难题,matlab,octave,Matlab,Octave,发布我的全部代码,希望有人能帮我调试这些垃圾。我真的希望能很快得出结论,因为我已经玩弄这个太久了 我这里有一个函数提取,它是从我的wordsearch函数中传递一个表示字母(即a=1,Z=26)的整数网格的。给定一个方向和一个由整数行向量表示的目标单词,它应该在网格中迭代以找到第一个字母的位置,并从这里向各个方向移动单词的长度,然后提取单词,例如,如果我们正在查找[14,5,9,2],并且14首先位于(4,4),我们应该在(4,8)处结束 然后在搜索函数中比较单词,如果它与目标单词匹配,则在实际
%//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