我附上了一张图片,其中显示了我需要检查好/坏块的图表。基本上,我有每个块的大小和行数和列数的信息。我也知道这行是偶数还是奇数。
我需要制作一个包含2个块的簇,并检查结果块(2的组合)是好还是坏。如果2个块是好的,那么结果是好的块,否则是坏的。
我需要知道它的算法。
如果行有奇数个块,我忽略了中间块并考虑了最后一个块。
图表呈圆形,但圆周上的块被忽略。所以,我必须只考虑图中所示的中间块。
我需要迭代每一行,组成一组2,找到结果。但是如果该行具有奇数个块,则忽略中间的块,并在角落处生成一组最后两个块。
如图所示,圆圈内的形状是真实的形象。
我想,这次我已经提供了足够的信息。
注意:在这个例子中,我创建了一组两个,但我需要在行中创建一组2,3或4个块,就像一般情况一样。如果组中的任何块都是坏的,那么整个组是坏的,无论是3组还是4组,我都需要用Visual Basic语言编写代码。大小,没有。图中所示行中的块不是真实数据。这只是一个例子。
我有一些类型的解决方案可以检查每个块及其周围的块是不正确的。但是可以这样做:
这是解决方案:
如果你要添加两个,那么一个badBlock意味着两边都不好导致3个坏了
1)设置struct {bool inCircle,badBlock,badGroup;}的NxN数组如果块在圆圈中,则inCircle为真,如果块为坏,则badBlock为真,最初badGroup为false。
int length=2;
for (int i=0; i<N;i++)
for(int j=0; j<N;j++)
if(array[i,j].badBlock){
for(int x=-length;x<=length;x++)
if(i+x>=0 and i+x<N and array[i+x,j].inCircle) then array[i+x,j].badGroup=true;
for(int y=-length;y<=length;y++)
if(j+y>=0 and j+y<N and array[i,j+y].inCircle) then array[i,j+y].badGroup=true;
}
我也知道每个街区的x和Y坐标。
答案 0 :(得分:0)
简单的递归会做,伪代码:
GroupSize = 2;
bool Calc(row, start, end)
{
if (end-start <= GroupSize -1) return true;
if (end - start < GroupSize*2) //Single group in the middle, but smaller than 2 groups (calculate only the first group size)
{
bool result = true;
for (i = start ; i < GroupSize; i++)
{
result = result && row[i];
}
}
else
{
return Calc(row, start, start + GroupSize) && Calc(row,end-GroupSize,end) && GroupSize(row, start + GroupSize,end-GroupSize);
}
}
类似的东西。
我们的想法是以递归方式计算行的两边,然后发送中间值以进行更多计算。
递归可能是最简单的方法(或者不适合所有人),任何递归都可以转换为循环。