c - 6*6 阵列中可能的最大沙漏总和

标签 c arrays multidimensional-array

有一个关于二维数组的问题,它说

给定一个 6*6 矩阵,我们必须打印矩阵中找到的最大(最大)沙漏和。
沙漏被描述为:

a b c
  d
e f g

样本输入
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

样本输出
19

解释

样本矩阵包含以下沙漏:
1 1 1   1 1 0   1 0 0   0 0 0
  1       0       0       0
1 1 1   1 1 0   1 0 0   0 0 0

0 1 0   1 0 0   0 0 0   0 0 0
  1       1       0       0
0 0 2   0 2 4   2 4 4   4 4 0

1 1 1   1 1 0   1 0 0   0 0 0
  0       2       4       4
0 0 0   0 0 2   0 2 0   2 0 0

0 0 2   0 2 4   2 4 4   4 4 0
  0       0       2       0
0 0 1   0 1 2   1 2 4   2 4 0

最大和 (19) 的沙漏是
2 4 4
  2
1 2 4

我编写了一个程序,其中我制作了一个用于计算沙漏总和的函数。现在我已经创建了一个循环,它为一行可能的每四个沙漏调用这个函数。每四行可以制作一个沙漏。
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <limits.h>
#include <stdbool.h>

int sum(int a[6][6],int i,int j)
{
    int n=i+3;
    int m=j+3;
    int sum=0;
   for(i;i<n;i++)
   {
       for(j;j<m;j++)
       {
           if(i==n-2)
           {
               sum += a[i][j+1];
               break;
           }
          else
             sum += a[i][j];
       }   
   }
   // printf("%d\t",sum);
    return sum;
}

int main(){
    int arr[6][6];
    int i,j,n,k;
    int max=0;
    for(int arr_i = 0; arr_i < 6; arr_i++){
       for(int arr_j = 0; arr_j < 6; arr_j++){

          scanf("%d",&arr[arr_i][arr_j]);
       }
    }
    for(int i=0;i<4;i++)
    {
        k=0;
        while(k<4)
        {
            n=sum(arr,i,k);
          //  printf("%d\t",n);
            k++;
            if(n>max)
                max=n;

        }
    }
    printf("%d",max);
    return 0;
}

谁能告诉我哪里出错了,或者这种方法不适合解决这个问题?

我的程序打印 10作为输出。

最佳答案

错误可能在您的 sum 中功能。你这样做的方式有点矫枉过正,你这样做会更简单(和可读!):

#define GRID_SIZE (6)
int sum(int a[GRID_SIZE][GRID_SIZE], int i, int j)
{   // Define an hourglass by the index i,j of its central element
    int sum = a[j-1][i-1] + a[j-1][i] + a[j-1][i+1] +
                            a[j][i] +
              a[j+1][i-1] + a[j+1][i] + a[j+1][i+1];
    return sum;
}

然后确保您使用合理的值进行迭代(在 [1, len-2] 中):
for (int i = 1; i < (GRID_SIZE-1); i++)
{
    for (int j = 1; j < (GRID_SIZE-1); j++)
    {
        n = sum(arr, i, j);
        if (n > max)
            max = n;

    }
}

编辑:检查它在这里是否有效:http://www.cpp.sh/46jhy

谢谢,那很有趣:-)。

PS:一定要检查一些编码标准文档,从长远来看它会让你的生活更轻松,只需搜索“C代码格式标准”并习惯尝试与你喜欢的人一起工作。除非你自己做一些新的事情,否则你可能必须遵循一个标准,甚至可能没有发言权,所以熟悉一般规则并习惯于遵循一个你喜欢的规则。

关于c - 6*6 阵列中可能的最大沙漏总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44724783/

相关文章:

graph - 无需重新访问即可遍历 3D 坐标的算法

c - 函数中的读取和指向结构的指针

c - 函数返回局部变量的地址,在c中

jQuery:将函数绑定(bind)到数组中的对象,避免关闭错误

php - array_push 多维数组中的某处

c - 初始化二维数组中的 n 个整数

c - 在 C 中打印 3d 数组中的 2d 部分(段错误)

c - FFTW - 当输入非常大时无法创建 FFT 计划

c - 为什么 stat 使用 readdir 中的名称失败?

javascript - 在 JS 中过滤具有深层嵌套数组的数组