【问题标题】:Dividing 2d array into all possible nxn squares将二维数组划分为所有可能的 nxn 正方形
【发布时间】:2013-06-03 23:45:53
【问题描述】:

已经在这方面花费了几个小时(因为我还在学习),所以也许你们可以提供帮助。 问题是我无法弄清楚如何将二维数组划分为所有可能的 nxn 正方形。 我正在随机化二维数组让我们说它是这样的:

1 0 1   
0 2 2    
3 5 1

这个矩阵 4-2x2 和 1-3x3 中有 5 个 nxn 方格

我们的目标是将所有这些正方形作为一个单独的数组,一个一个地提供给函数。

附言对不起英语不好


简化:

我输入这个数组:

char array[9] = {1,0,1,0,2,2,3,5,1};

并希望将以下数组传递给函数:

char array[9] = {1,0,1,0,2,2,3,5,1};
char array[4] = {1,0,0,2};
char array[4] = {0,1,2,2};
char array[4] = {0,2,3,5};
char array[4] = {2,2,5,1};

如何从主矩阵中提取这些子矩阵?

【问题讨论】:

  • 我稍微编辑了您的问题,因为您实际上没有提出问题。讲个故事吧。我为其他人添加了一些说明,以便更容易理解这个问题:) 欢迎来到 Stackoverflow!
  • 您还遗漏了 1x1 矩阵(样本中有 9 个)。

标签: c matrix multidimensional-array


【解决方案1】:

实现这一点的常用方法是提供行/列偏移量和大小:

void DisplaySubArray( int arr[3][3], int x0, int y0, int size ) 
{
    int x, y, *row;

    for( y = 0; y < size; y++ )
    {
        row = &arr[y0+y][x0];
        for( x = 0; x < size; x++ )
        {
            printf( "\t%d", row[x] );
        }
        printf( "\n" );
    }
}

还有枚举:

const int N = 3;
int arr[3][3] = { 1, 0, 1, 0, 2, 2, 3, 5, 1 };
int x0, y0, size;

for( size = 2; size <= N; size++ )
{
    for( y0 = 0; y0 <= N-size; y0++ )
    {
        for( x0 = 0; x0 <= N-size; x0++ )
        {
            printf( "%dx%d at position (%d,%d):\n", size, size, x0, y0 );
            DisplaySubArray( arr, x0, y0, size );
        }
    }
}

【讨论】:

  • 当你使用函数时,算法似乎并不那么令人沮丧:),非常感谢,我想我现在明白了,还有一个问题 - 如果主矩阵不是正方形,这仍然可以工作我只需要为“DisplaySubArray”函数提供正确的参数,并在 main 中使用一些 if 语句。我说的对吗?
  • 在这种情况下,N 将成为两个变量(例如WIDTHHEIGHT)并相应地使用。无需其他修改。
【解决方案2】:

我认为在这种情况下使用递归算法是最好的方法。

让我们想象一下。您有矩阵 MxN,并且您已经处理了 MxN 的所有子矩阵。此时我们需要将我们的解决方案扩展到矩阵 (M+1)xN - 大小相同,但多一列或一行。

事实上,我们需要在我们的子矩阵中添加一些其他子矩阵的数量,但我们可以很容易地做到这一点。看看下面:

ABC
DEF
GHI

扩展到

ABCX
DEFY
GHIZ

我们只需要添加 XY 和 YZ 子矩阵(子矩阵,在右侧以 XY 和 YZ 结尾),也许你需要在 X,Y,Z 子矩阵中,我不知道(我没有在主题开始帖子)。因此,事实上,我们可以很容易地获得所有必要的右侧(例如,for{for{}} 循环)以用于一般的解决方案(对于任何 N)。最后,再添加一个循环(从 A 列到 C 或 X 列)。

我想很明显我们得到了所有子矩阵,这些子矩阵是由于 MxN -> (M+1)xN 动作而出现的。

最终解决方案 - 我们从一些基本子矩阵(1x1、2x2,如您所愿)开始,并针对每个维度将其扩展一。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-27
    • 1970-01-01
    • 1970-01-01
    • 2018-05-03
    • 2017-03-27
    • 1970-01-01
    • 2015-05-10
    • 2019-04-18
    相关资源
    最近更新 更多