我们如何在 java 或 C++ 中生成给定 2D 矩阵的所有子矩阵
How can we generate all submatrix of a given 2D matrix in java or C++?
我正在使用这个循环结构,但它无法生成任何给定的 2D 矩阵可能具有 n 行和 m 列的所有子矩阵。
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();
}
}
}
例如:给定矩阵 3X3 : [[1 2 3],[4 5 6],[7 8 9]]那么它的子矩阵将是:对于尺寸 1:[1],[2],[3],[4],[5],[6],[7],[8],[9]对于尺寸 4:[[1,2],[4,5]],[[2,3],[5,6]],[[4,5],[7,8]]和[[5,6],[8,9]]等等
您还缺少几个循环来涵盖所有情况。 PrintMatyrix()
应该有 2 个用于打印内容的嵌套循环。
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);
}
}
}
}
如果我们有一个维度为 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("*****************");
}
}
你不应该循环,你应该使用一些递归。
这样想一想,对于每一行或每一列,你要么拿走它,要么扔掉它。因此,您可以先选择行,然后选择列,并根据所选的行和列构建子矩阵。
一些代码,
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]
}
}
相关文章:
- 2D数组来自文本输入,中间有空格
- 将值指定给向量(2D)的向量中的某个位置
- 如何使用用户输入在C++中正确填充2D数组
- 如何在C++中检查2D数组中负值的输入验证
- 当我在main中声明了我的2d数组时,为什么我的程序会退出
- 在java中解决这段代码时面临循环中的问题
- 在 2D 向量中使用第三个 [ ] 有什么意义?
- 尝试用java代码编译和运行c++代码
- 四边形的 2D 旋转
- 打印第二列时的2d字符矢量打印空间
- 在这种情况下,java对象是否可以调用本机函数
- 在java中读取c++字节的位字段
- 如何将以逗号和空格分隔的整数读取到 2D 数组中?
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- 我们如何在 java 或 C++ 中生成给定 2D 矩阵的所有子矩阵
- 如何修复将传输到 java 的 2d 数组代码使用 JNI
- 如何在一行中使用 Java 中的 ArrayList 创建大小为 M*N 的 2D 矩阵,其中 X 作为每个单元格的值?
- 创建数组数组 (2D),而无需在 Java 中初始化内部数组
- 将2d数组从C++传递到Java并返回到C++
- C#/Java 如何存储 2D 数组,与C++不同?