算法问题 - 附图片

时间:2011-07-21 17:53:57

标签: algorithm design-patterns

我附上了一张图片,其中显示了我需要检查好/坏块的图表。基本上,我有每个块的大小和行数和列数的信息。我也知道这行是偶数还是奇数。

我需要制作一个包含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坐标。

enter image description here

1 个答案:

答案 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);

   }
}

类似的东西。
我们的想法是以递归方式计算行的两边,然后发送中间值以进行更多计算。

递归可能是最简单的方法(或者不适合所有人),任何递归都可以转换为循环。