如何在Matrix中查找具有最大和的子矩阵

时间:2016-06-14 09:26:59

标签: c++

给定一个包含这些元素的矩阵:

4 2 7 11
3 8 19 1
11 12 7 5
19 14 4 7

编写C ++代码以查找具有最大总和的2x2子矩阵。

在这种情况下:

 11 12
 19 14

我已经做了一些事情,但它不起作用:

  #include <iostream>

using namespace std;


int main()
{
    int n,m;

    cout<<"Give M and N ";
    cin>>m>>n;
    int a[m][n];
    for(int i=0;i<m;i++) {
    for(int j=0;j<n;j++){
        cin>>a[i][j];
    }
    }
    int smax=0,suma,x,y,k,l,i,j;


    for(i=0;i<n;i++) {
        for(j=0;j<m;j++) 
            for(k=i;k<i+2;k++)
            for(l=j;l<j+2;l++) suma=suma+a[k][l];

    if(suma>smax) {smax=suma; x=i,y=j; }
    }

    for(int i=x;i<i+2;i++)
        for(int j=y;j<j+2;j++)
            cout<<a[i][j]<<" ";
}

1 个答案:

答案 0 :(得分:0)

纠正了很多错误:

  • 正确初始化变量。
  • 添加了一项检查,以查看给定kl下的当前循环变量(ij)是否构成有效的2x2矩阵。
  • 更干净地重写主循环。
  • 当输入矩阵的大小小于2x2时,添加了对案例的检查。
  • 最后修正了打印循环。 (x+2代替i+2
#include <iostream>

using namespace std;


int main()
{
    int m, n;

    cout << "Give M and N - ";
    cin >> m >> n;

    int a[m][n];

    for ( int i = 0; i < m; i++ )
    {
        for ( int j = 0; j < n; j++ )
        {
            cin >> a[i][j];
        }
    }


    int smax = -1, suma = -1, x = -1, y = -1;

    for ( int i = 0; i < m; i++ )
    {
        for ( int j = 0; j < n; j++ )
        {
            suma = 0;
            if ( i + 1 >= m || j + 1 >= n )
            {
                // No 2x2 matrix exists for this i and j.
                continue;
            }

            for ( int k = i; k < i + 2; k++ )
            {
                for ( int l = j; l < j + 2; l++ )
                {
                    suma = suma + a[k][l];
                }
            }

            if ( suma > smax )
            {
                smax = suma;
                x = i, y = j;
            }
        }
    }

    cout << endl << x << " " << y << " "  << smax << endl;

    if ( x == -1 || y == -1 )
    {
        // No 2x2 matrix found!
        cout << "Invalid input!" << endl;
        return 0;
    }

    for ( int i = x; i < x + 2; i++ )
    {
        for ( int j = y; j < y + 2; j++ )
        {
            cout << a[i][j] << " ";
        }
        cout << endl;
    }

}

Demo

注意: int a[m][n];是可变长度数组,在ISO C ++中是禁止的,即使某些编译器(如GCC)可能支持它。 您可以使用二维向量,同时保持代码的其余部分与以前相同:

vector<vector<int> > a ( m, vector<int> ( n ) );