我试图解决C ++中的沙漏问题。
任务如下
给出6x6 2D阵列,A:
1 1 1 0 0 0
0 1 0 0 0 0
1 1 1 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
我们将A中的沙漏定义为值的子集,其索引在A的图形表示中落在此模式中:
a b c
d
e g g
A中有16个沙漏,沙漏总和是沙漏值的总和。
任务
计算A中每个沙漏的沙漏总和,然后打印最大沙漏总和。
对于这个问题,我写了代码:
int main(){
vector< vector<int> > arr(6,vector<int>(6));
int max , sum;
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];
}
}
for(int arr_i = 0; arr_i < 4; arr_i++){
for(int arr_j = 0; arr_j < 4; arr_j++){
sum = arr[arr_i][arr_j] + arr[arr_i][arr_j+1] + arr[arr_i][arr_j+2] + arr[arr_i+1][arr_j+1] + arr[arr_i+2][arr_j] + arr[arr_i+2][arr_j+1] + arr[arr_i+2][arr_j+2];
if(sum > max) {
max = sum;
}
}
}
cout << max << endl;
return 0;
}
如果我没有初始化int max = -63
,这是沙漏的最小可能总和,则max变量会在其中存储正值,例如4198560
。因此我的if(max<sum){ ... }
条件无法正常工作,因为我没有使用最小可能值来最大化最大值。
但是,在使用最小值初始化max之后,它可以正常工作。你知道这个可能的价值来自哪里吗?它是内存中的转储数据吗?
谢谢
答案 0 :(得分:2)
如果你没有指定max的初始值,那么它的值就是当时在该内存地址处发生的任何值。使用单元化内存是未定义的行为,值可以是任何值。
答案 1 :(得分:0)
如果我是您,我将使用INT_MIN
,这意味着将使用int
数据类型中的最小值初始化变量,并对Long使用LLONG_MIN
,但是为什么呢?确保您的变量具有最小值。这是代码:
int hourglass_sum(vector<vector<int>> arr)
{
int sum ,result = INT_MIN;
for(int row=0; row <= 3 ; ++row)
{
for(int column = 0 ; column <=3 ; ++column)
{
sum = arr[row][column] + arr[row][column+1] + arr[row][column+2] + arr[row+1][column+1] +arr[row+2][column] + arr[row+2][column+1] + arr[row + 2][column+2];
result = max(result,sum);
}
}
return result;
}
答案 2 :(得分:0)
def hourglassSum(arr): #code is in python
# want to find the maximum hourglass sum
# minimum hourglass sum = -9 * 7 = -63
max_sum = -9*7
new_list = []
for i in range(0,4):
for j in range(0,4):
# sum of top 3 elements
level1 = sum(arr[i][j:j+3])
# sum of mid element
level2 = arr[i+1][j+1]
# sum of bottom 3 elements
level3 = sum(arr[i+2][j:j+3])
max_number = level1+level2+level3
new_list.append(max_number)
max_sum = max(new_list)
return max_sum