给定一个包含这些元素的矩阵:
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]<<" ";
}
答案 0 :(得分:0)
纠正了很多错误:
k
和l
下的当前循环变量(i
和j
)是否构成有效的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;
}
}
注意: int a[m][n];
是可变长度数组,在ISO C ++中是禁止的,即使某些编译器(如GCC)可能支持它。
您可以使用二维向量,同时保持代码的其余部分与以前相同:
vector<vector<int> > a ( m, vector<int> ( n ) );