将2d数组划分为所有可能的nxn方块

时间:2013-06-03 23:45:54

标签: c matrix multidimensional-array

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

1 0 1   
0 2 2    
3 5 1

在该矩阵4-2x2和1-3x3

中有5个nxn正方形

目标是将所有这些方块一个接一个地作为一个单独的数组提供给函数。

P.S。抱歉英语不好


简化:

我输入了这个数组:

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};

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

2 个答案:

答案 0 :(得分: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 );
        }
    }
}

答案 1 :(得分:0)

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

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

事实上,我们需要在子矩阵中添加一些其他子矩阵,但我们可以轻松完成。看看下面:

ABC
DEF
GHI

延伸至

ABCX
DEFY
GHIZ

我们只需要添加XY和YZ子矩阵(子矩阵,以XY和YZ在右侧结束),也许你需要X,Y,Z子矩阵,我不知道(我还没有看到它们)主题开始发布)。事实上,我们可以轻松获得所有必要的权利(例如,对于{for {}}循环)以获得解决方案(对于任何N)。最后,添加一个循环(从A列到C或X列)。

我认为很明显我们得到了所有的子矩阵,这些子矩阵都是由于MxN而出现的 - &gt; (M + 1)xN行动。

最终解决方案 - 我们从一些基础子矩阵(1x1,2x2,如你所愿)开始,并为每个维度扩展一个。