求和向量中的C ++错误

时间:2017-12-26 14:22:17

标签: c++ multidimensional-array vector

任务:

  

在6x6阵列中,可以构建16个3x3阵列。找到3x3阵列的最大总和(来源:https://www.hackerrank.com/challenges/30-2d-arrays/problem

示例:

enter image description here

最大的3x3阵列是

2 4 4

0 2 0

1 2 4

所以我们打印出19

我的代码:

    #include <iostream>
#include <vector>
#include <algorithm>
#include <math.h>

using namespace std;
int main()
{
    vector< vector<int> > arr(6,vector<int>(6));
    for(int arr_i = 0;arr_i < 6;arr_i++){
       for(int arr_j = 0;arr_j < 6;arr_j++){
          cin >> arr[arr_i][arr_j];
       }
    }
    int maxVal = 0;
    for (int y = 2; y < 6; y++)
    {
        for (int x = 2; x < 6; x++)
        {
            if ( y >=2  && x >=2)
            {
                int vert = y;
                int hori = x;
                int first = arr[vert-2][hori] + arr[vert-2][hori-1] + arr[vert-2][hori-2];
                int second = arr[vert-1][hori-1] ;
                int third = arr[vert][hori] + arr[vert][hori-1] + arr[vert][hori-2];
                int sum = first + second + third;
                if (sum > maxVal)
                    maxVal = sum;
            }
        }
    }
    cout << maxVal;
}

修改

我误解了这个问题,但我解决了这个问题。后来,我仍然得到了不正确的测试用例。最初的解决方案似乎是错误的。

问题:当我提交代码时,一些测试用例会返回错误的答案。我尝试阅读代码,似乎没有错。

3 个答案:

答案 0 :(得分:0)

提供链接的问题不是关于3x3子矩阵,而是关于沙漏形状:

a b c
  d
e f g

为了获得正确的值;你的第二行的总和应该是:

int second = arr[vert-1][hor-1]

而且,if语句不需要像评论中已经提到的那样。

答案 1 :(得分:0)

这是一个更干净的代码。从[1][1]开始,一直到[length-1][length-1]。并在每次迭代时,计算周围沙漏的总和。

另外,请注意,您需要对hourGlass而不是3x3 subArray求和。

#include <iostream>
#include <vector>
#include <algorithm>
#include <math.h>

using namespace std;
int main()
{

    // user input
    //vector< vector<int> > myVector(6,vector<int>(6));
    //for(int arr_i = 0;arr_i < 6;arr_i++)
    //   for(int arr_j = 0;arr_j < 6;arr_j++)
    //       cin >> myVector[arr_i][arr_j];

    // sample input
    vector<vector<int>> myVector = {
                                        { { 1 },{ 1 },{ 1 },{ 0 },{ 0 },{ 0 } },
                                        { { 0 },{ 1 },{ 0 },{ 0 },{ 0 },{ 0 } },
                                        { { 1 },{ 1 },{ 1 },{ 0 },{ 0 },{ 0 } },
                                        { { 0 },{ 0 },{ 2 },{ 4 },{ 4 },{ 0 } },
                                        { { 0 },{ 0 },{ 0 },{ 2 },{ 0 },{ 0 } },
                                        { { 0 },{ 0 },{ 1 },{ 2 },{ 4 },{ 0 } },
                                    };

    int maxVal = -9999; // start with big negative
    for (int y = 1; y < 5; y++)
    {
        int sum = 0;
        for (int x = 1; x < 5; x++)
        {
            sum = myVector[y - 1][x - 1] + myVector[y - 1][x] + myVector[y - 1][x + 1]; // first row of the hourglass
            sum += myVector[y][x];                                                      // second row
            sum += myVector[y + 1][x - 1] + myVector[y + 1][x] + myVector[y + 1][x + 1];// third row

            if (sum > maxVal)
                maxVal = sum;
        }
    }
    cout << maxVal << endl;

    system("pause");
    return 0;
}

答案 2 :(得分:0)

代码

/*show fom*/
function myFunction() {
    $('.show-form').show();

    //        $('.show-form').hide();

}

解释

这是一个值很小的简单问题,因此我们不需要动态编程(YAY!)。 当我们可以正确地使用数组时,向量在这里也没用。 基本上我搜索每组3x3正方形,并找到最大总和。希望这有帮助!