Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java或C+中生成给定2D矩阵的所有子矩阵+;?_Java_C++_Algorithm - Fatal编程技术网

如何在java或C+中生成给定2D矩阵的所有子矩阵+;?

如何在java或C+中生成给定2D矩阵的所有子矩阵+;?,java,c++,algorithm,Java,C++,Algorithm,我使用这个循环结构,但它无法生成任何给定的具有n行和m列的2D矩阵的所有子矩阵 for(i=0;i<n;i++) { for(j=0;j<m;j++) { System.out.println("sub-MATRIX:"); for(k=i;k<n;k++) { for(p=j;p<m;p++)

我使用这个循环结构,但它无法生成任何给定的具有n行和m列的2D矩阵的所有子矩阵

  for(i=0;i<n;i++)
    {
        for(j=0;j<m;j++)
        {
            System.out.println("sub-MATRIX:");
            for(k=i;k<n;k++)
            {
                for(p=j;p<m;p++)
                {
                   System.out.print(arr[k][p]+" ");
                }
                System.out.println();
            }
        }
    }

对于(i=0;i不应该使用循环,应该使用一些递归

考虑一下这种方式,对于每一行或每一列,您要么接受它,要么扔掉它。因此,您可以先选择行,然后选择列,然后根据选择的行和列构造子矩阵

一些代码

bool rowTaken[N], columnTaken[M];
void constructSubMatrixRow(int i)
{
    if (i >= N) constructSubMatrixCol(0);
    rowTaken[i] = true;
    constructSubMatrix(i+1);
    rowTaken[i] = false;
    constructSubMatrix(i+1);
}

void constructSubMatrixCol(int i)
{
    if (i >= M) printSubMatrix();
    columnTaken[i] = true;
    constructSubMatrixCol(i+1);
    columnTaken[i] = false;
    constructSubMatrixCol(i+1);
}

void printSubMatrix()
{
    for (unsigned i = 0; i < N; i++)
        if (rowTaken[i]){
            for (unsigned j = 0; j < M; j++)
               if (columnTaken[j])
                  print matrix[i][j]
        }
}
bool rowtake[N],columntake[M];
无效子矩阵行(int i)
{
如果(i>=N)构造子矩阵xcol(0);
rowtaked[i]=真;
构造子矩阵(i+1);
rowtake[i]=假;
构造子矩阵(i+1);
}
无效子矩阵xcol(int i)
{
如果(i>=M)printSubMatrix();
[i]=true;
构造子矩阵xcol(i+1);
[i]=false;
构造子矩阵xcol(i+1);
}
void printSubMatrix()
{
for(无符号i=0;i
您缺少了几个覆盖所有案例的循环。
PrintMatyrix()
应该有两个用于打印内容的嵌套循环

  for (i = 1; i < n; ++i)
  {
    for (j = 1; j < m; ++j)
    {
      // we are at each sub matrix of size(i,j)
      for (k = 0; k <= (n - i); ++k)
      {
        for (p = 0; p <= (m - j); ++p)
        {
           // we are at submatrix of size(i,j) starting at (k,p)
           // assuming PrintMatrix(Matrix&, int rows, int cols, int r0, int c0);   
           PrintMatrix(arr, i, j, k, p);
        }
      }
    }
  }
(i=1;i { 对于(j=1;j对于(k=0;k如果我们有一个维数为M x N的矩阵,并且我们正在寻找的子矩阵具有k x L维数。如果有更优化的解决方案,请共享

for (int i = 0; i < m-k+1; i++) {   
                for (int j = 0; j < n-l+1; j++) {
                    for (int p = 0; p < k; p++) {
                        for(int q = 0; q < l; q++) {
                            System.out.print(arr[i+p][j+q] + " ");
                        }
                        System.out.println();
                    }
                    System.out.println("*****************");

                }
            }
for(inti=0;i< /代码>请提供更多的细节:输入、预期输出、实际输出?子矩阵的大小?这与C++相关?听起来更像是一种算法。problem@K.Kirsz我添加了一个例子,任务是在给定的矩阵中生成所有可能的子矩阵,所有大小的子矩阵都可以这样想:您正在寻找所有可能的子矩阵l MxN矩阵中UxV矩阵的左上角。有(M-U+1)x(N-V+1)个候选。只需迭代这些。函数printSubMatrix()的行和列界限是什么?@mohdanishh,printSubMatrix只是打印出使用rowtake和columntake构造的子矩阵。请参阅更新的伪代码。如果您能构造函数printSubMatrix(),这将非常有用,它将帮助我完全理解您的算法。Thanks@mohdanishh,请刷新并查看更新的代码