任务:
在6x6阵列中,可以构建16个3x3阵列。找到3x3阵列的最大总和(来源:https://www.hackerrank.com/challenges/30-2d-arrays/problem)
示例:
最大的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;
}
修改
我误解了这个问题,但我解决了这个问题。后来,我仍然得到了不正确的测试用例。最初的解决方案似乎是错误的。
问题:当我提交代码时,一些测试用例会返回错误的答案。我尝试阅读代码,似乎没有错。
答案 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正方形,并找到最大总和。希望这有帮助!