关于C ++中的二维数组,我的解决方案有什么问题?

时间:2013-06-05 15:28:14

标签: c++

说明

杰克在他的花园里种了一些花生。花园是一个L * W长方形,每个单位区域都有其独立的花生数量。他想知道在给定大小的地区花生的最大数量是多少。该区域的固定大小为a * b。

输入格式:

第1行:2个整数长度L和宽度W

第2行 - L + 1:每行W个整数,表示单位面积中花生的数量,A(0 <= A <= 10)

线L + 2:2整数,a和b,表示所选区域的长度和宽度

输出格式:

一个整数m,它是所选a * b区域中花生量的最大总和

示例输入:

4 5
1 2 3 4 5
6 7 8 0 0
0 9 2 2 3
3 0 0 0 1
3 3

示例输出

38

满足的数据:1≤a≤L,1≤b≤W

我认为这个问题可以抽象为: 返回L * W数组的* b子数组中的最大数字和 我认为有(L-a + 1)*(W-b + 1)可能的总和,我必须找到最大值。

我的代码在这里,无法给出正确的结果。我的代码总是返回区域的左上区域的总和,但实际上问题需要在所有可能的位置中返回a * b区域的MAXIMUM SUM。非常感谢提前!

#include <iostream>
#include <cstring>
using namespace std;
 
int L,W,a,b,i,j,x,y,p,q,r,s;
 
int main()
{
    cin>>L>>W;
    int peanut[L][W];
    for (i=0;i<L;i++) 
     for (j=0;j<W;j++) 
       cin>>peanut[i][j];
    cin>>a>>b;
 
    int sumArray[L-a+1][W-b+1];
    memset(sumArray,0,(L-a+1)*(W-b+1)*sizeof(int));
     
    for (p=0;p<L-a+1;p++)
     for (q=0;q<W-b+1;q++) 
       {
        for (r=p;r<a;r++)
         for (s=q;s<b;s++) sumArray[p][q]+=peanut[r][s]; 
       }
        
    int max = 0;
    for (x=0;x<L-a+1;x++)
     for (y=0;y<W-b+1;y++) 
       if (sumArray[x][y]>max) max=sumArray[x][y];
    cout << max;
    return 0;
}

3 个答案:

答案 0 :(得分:1)

问题是你没有仔细索引元素来计算sumArray。我只更改了两行代码才能使其正常工作。

for (r=0;r<a;r++)
  for (s=0;s<b;s++) sumArray[p][q]+=peanut[p+r][q+s]; 

以下是完整代码。如果还有其他问题,请修复它。

#include <iostream>
#include <cstring>
using namespace std;

int L,W,a,b,i,j,x,y,p,q,r,s;

int main()
{
    cin>>L>>W;
    int peanut[L][W];
    for (i=0;i<L;i++) 
     for (j=0;j<W;j++) 
       cin>>peanut[i][j];
    cin>>a>>b;

    int sumArray[L-a+1][W-b+1];
    memset(sumArray,0,(L-a+1)*(W-b+1)*sizeof(int));

    for (p=0;p<L-a+1;p++)
     for (q=0;q<W-b+1;q++) 
       {
        for (r=0;r<a;r++)
         for (s=0;s<b;s++) sumArray[p][q]+=peanut[p+r][q+s]; 
       }

    int max = 0;
    for (x=0;x<L-a+1;x++)
     for (y=0;y<W-b+1;y++) 
       if (sumArray[x][y]>max) max=sumArray[x][y];
    cout << max;
    return 0;
}

答案 1 :(得分:0)

有两个问题。首先,ab是测试区域的大小。

     for (r=p;r<a;r++)
       for (s=q;s<b;s++) 
          sumArray[p][q]+=peanut[r][s];

此处,pq代表初始设置,但是您要根据子标注维度限制检查索引。相反,它应该是:

     for (r=p;r<p+a;r++)
       for (s=q;s<q+b;s++) 
          sumArray[p][q]+=peanut[r][s];

第二个问题是38 答案; topleft-most区域包含所有子矩形的最大值。这是我打印所有值的解决方案。应该注意的是,当int arr[X][Y]X不是const(无法编译)时,我不熟悉这个Y业务,因此我将其更改为I熟悉。

#include <iostream>
#include <cstring>
using namespace std;

int L,W,a,b,i,j,x,y,p,q,r,s;

int main()
{
    cin>>L>>W;
    int** peanut=new int*[L]; //a new row pointer for each column element
    for (i=0;i<L;i++){ 
     peanut[i]=new int[W]; //the actual row for each column element
        for (j=0;j<W;j++)
            cin>>peanut[i][j];
    }
    cin>>a>>b;

    //don't need to remember results; just compare maximum after each evaluation.
    //int sumArray[L-a+1][W-b+1];
    //memset(sumArray,0,(L-a+1)*(W-b+1)*sizeof(int));

    int max = 0;
    for (p=0;p<L-a+1;++p){
        for (q=0;q<W-b+1;++q){

           int sum=0;
           for (r=p;r<p+a;++r) //r<p ==> r<p+a, prefix increment is always better
               for (s=q;s<q+b;++s){ //s<q ==> s<q+b, prefix increment is always better
                   cout << "(" << r << "," << s << "," << peanut[r][s] << ") ";
                   sum+=peanut[r][s]; 
               }
           cout << sum << endl;
           if(sum>max) max=sum;

        }
    }

    /*  Merged in previous loop
    int max = 0;
    for (x=0;x<L-a+1;x++)
     for (y=0;y<W-b+1;y++) 
       if (sumArray[x][y]>max) max=sumArray[x][y];
    */

    cout << "Answer: " << max;

    //Since I'm in Visual Studio, I need to pause and see the result before quitting...
    int s;
    cin >> s;

    return 0;
}

答案 2 :(得分:0)

问题在于这一部分:

for (r=p;r<a;r++)
         for (s=q;s<b;s++) sumArray[p][q]+=peanut[r][s];

您没有迭代ab次。将其更改为:

for (r=p;r<p+a;r++)
         for (s=q;s<q+b;s++) sumArray[p][q]+=peanut[r][s];