- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
给定一个 6x6 2D 数组:
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 b c
d
e f g
arr中有16个沙漏,沙漏总和是沙漏值的总和。计算arr中每个沙漏的沙漏总和,然后打印最大沙漏总和。
例如,给定二维数组:
-9 -9 -9 1 1 1
0 -9 0 4 3 2
-9 -9 -9 1 2 3
0 0 8 6 6 0
0 0 0 -2 0 0
0 0 1 2 4 0
我们计算以下 16 个沙漏值:
-63, -34, -9, 12,
-10, 0, 28, 23,
-27, -11, -2, 10,
9, 17, 25, 18
这是我写的代码
#include<stdio.h>
const int M=6;
const int N=6;
int hourglassSum(int arr_rows, int arr_columns, int arr[M][N]) {
int rows,columns;
rows=arr_rows-(arr_rows/3);
columns=arr_columns-(arr_columns/3);
int a[columns-1][rows-1];
int min_r,min_c,max_r,max_c,sum;
sum=0;
for(int k=0;k<columns;k++)
{
min_c=k;
max_c=k+2;
for(int l=0;l<rows;l++)
{
min_r=l;
max_r=l+2;
sum=0;
for(int i=min_c;i<=max_c;i++)
{
if(max_c>=arr_columns)
break;
for(int j=min_r;j<=max_r;j++)
{
if(max_r>=arr_rows)
break;
if(i!=min_c && i!=max_c)
{
int no=j+1;
sum +=arr[i][no];
break;
}
sum += arr[i][j];
}
}
a[min_c][min_r]=sum;
}
}
int max=-111;
for(int b=0;b<columns;b++)
{
for(int c=0;c<rows;c++)
{
if(max<a[b][c])
max=a[b][c];
}
}
for(int i=0;i<columns;i++)
{
for(int j=0;j<rows;j++)
printf("%d ",a[i][j]);
printf("\n");
}
return max;
}
int main()
{
int arr[6][6];
int arr_rows=6;
int arr_columns=6;
for(int i=0;i<arr_columns;i++)
for(int j=0;j<arr_rows;j++)
scanf("%d",&arr[i][j]);
int result=hourglassSum(arr_rows,arr_columns,arr);
printf("\n%d",result);
}
我输入的内容为
-9 -9 -9 1 1 1
0 -9 0 4 3 2
-9 -9 -9 1 2 3
0 0 8 6 6 0
0 0 0 -2 0 0
0 0 1 2 4 0
预期输出是
-63 -34 -9 12
-10 0 28 23
-27 -11 -2 10
9 17 25 18
但我的输出是
-63 -34 -9 -10
-10 0 28 -27
-27 -11 -2 9
9 17 25 18
出了什么问题?
最佳答案
您的计算:
rows=arr_rows-(arr_rows/3);
columns=arr_columns-(arr_columns/3);
恰好产生了正确的答案,因为 6/3
是 2,这是要减去的正确值。如果矩阵是 12x12,您将省略行和列 - 由于沙漏的形状,您应该减去 2(或减去 hourglass_width - 1
和 hourglass_height - 1
) > 对于非方形沙漏的一般情况)。
使用 int max=-111;
是危险的 - 同样,它恰好适用于示例数据,但它不是通用解决方案。使用a[0][0]
中的值作为初始最大值。它可能是一个幸运的猜测,实际上是最大值,但如果有的话,它会被另一个更大的值替换。
您应该消除 M
和 N
并使用:
int hourglassSum(int arr_rows, int arr_columns, int arr[arr_rows][arr_columns]) {
这将允许您将其他大小的数组传递给代码。
但是,主要问题是您将 a
矩阵设置得太小。您应该使用int a[columns][rows]
。 (C 中的数组通常为 a[rows][columns]
,但如果你保持一致,则可以反转它们,并且当 rows == columns
时差异并不重要> 无论如何。)通过尺寸较小的矩阵,我得到了你得到的结果;使用正确大小的矩阵,我得到了预期的结果。
#include <stdio.h>
static int hourglassSum(int arr_rows, int arr_columns, int arr[arr_rows][arr_columns])
{
int rows = arr_rows - 2;
int columns = arr_columns - 2;
int a[columns][rows];
for (int k = 0; k < columns; k++)
{
int min_c = k;
int max_c = k + 2;
for (int l = 0; l < rows; l++)
{
int min_r = l;
int max_r = l + 2;
int sum = 0;
for (int i = min_c; i <= max_c; i++)
{
if (max_c >= arr_columns)
break;
for (int j = min_r; j <= max_r; j++)
{
if (max_r >= arr_rows)
break;
if (i != min_c && i != max_c)
{
int no = j + 1;
sum += arr[i][no];
break;
}
sum += arr[i][j];
}
}
a[k][l] = sum;
}
}
int max = a[0][0];
for (int b = 0; b < columns; b++)
{
for (int c = 0; c < rows; c++)
{
if (max < a[b][c])
max = a[b][c];
}
}
for (int i = 0; i < columns; i++)
{
for (int j = 0; j < rows; j++)
printf(" %3d", a[i][j]);
printf("\n");
}
return max;
}
int main(void)
{
int arr[6][6];
int arr_rows = 6;
int arr_columns = 6;
for (int i = 0; i < arr_columns; i++)
{
for (int j = 0; j < arr_rows; j++)
{
if (scanf("%d", &arr[i][j]) != 1)
{
fprintf(stderr, "failed to read an integer\n");
return 1;
}
}
}
int result = hourglassSum(arr_rows, arr_columns, arr);
printf("\n%d\n", result);
return 0;
}
输出:
-63 -34 -9 12
-10 0 28 23
-27 -11 -2 10
9 17 25 18
28
请注意,这或多或少是对问题中代码的最小修复。我自己的代码在很多方面看起来都会有所不同(不同的变量名、更多的函数等)。另一项更改(上面未进行):您实际上不需要数组 a
;您可以在计算每个位置的沙漏总和后简单地记录当前最大值。
-1 1 -1 0 0 0
0 -1 0 0 0 0
-1 -1 -1 0 0 0
0 -9 2 -4 -4 0
-7 0 0 -2 0 0
0 0 -1 -2 -4 0
我得到输出:
-5 -2 -2 0
-9 -13 -6 -8
-19 -2 -7 -6
-8 -14 -15 -14
0
这会产生您所说的预期答案0
(并且我同意0
是应该预期的)。
关于c - 二维数组中的意外输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58079499/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许在 Stack Overflow 上提出有关通用计算硬件和软件的问题。您可以编辑问题,使其成为
当我尝试在 db2 中创建表时,它抛出以下错误 $ db2 CREATE TABLE employee(emp_id INT NOT NULL, emp_name VARCHAR(100)) sh:
我有: while (i < l) { if (one === two) { continue; } i++; } 但是 JSLint 说: Problem at line 1 chara
所以我有这个代码: char inputs[10] = ""; int numInputs = 0; while (numInputs < 10){ char c; printf("E
var ninja = { name: 'Ninja', say: function () { return 'I am a ' + this.name; }
我收到一个我不明白的错误,请注意,我是编码新手,所以这可能是一个简单的错误。 #include using namespace std; int main() { //Initialise Fahr
我正在使用 javascript 和 react,由于某种原因,我收到了一个奇怪的 token 错误。 这是发生错误的代码: renderNavBar() { if (!this.us
Closed. This question is off-topic。它当前不接受答案。
由于某种我无法解释的原因,编译器正在输出一个错误,指出它发现了一个意外的#else 标记。 这发生在文件的开头: #if defined( _USING_MFC ) #include "stda
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
这个问题在这里已经有了答案: Difference between sh and Bash (11 个答案) 关闭 2 年前。 我正在编写一个简单的 bash 脚本,我在 XX `(' unexpe
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 此问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-topic
我在 Windows 7 上编写了一个脚本,它不断给我一个错误“(此时出乎意料。”对于以下代码 if %vardns%=="NODNS" ( netsh interface ipv4 set ad
我正在尝试使用xmlstarlet(使用xpath)解析XML文件,但是出现语法错误,并且我不知道如何更正我的代码。 这是我的脚本: #!/bin/bash if [ $1=="author" ];
以下脚本旨在在目录中的所有文件上运行程序“senna”,并将每个文件的输出(保留输入文件名)写入另一个目录 for file in ./Data/in/*; do ./senna -iobta
我从 challengers.coffee 运行此代码,并收到错误 ActionView::Template::Error (SyntaxError: [stdin]:3:31:unexpected
我在 config.db.database; 行中有语法错误(意外的标记“.”)。这是我在文件中的代码 const config = require('../config/config') const
这一定很明显,但是我无法使它正常工作。我正在尝试传输应该用于构建$ classKey的对象,这反过来又导致删除所需的软件(amd64或i386)。好吧,这里的代码: $name = @("softwa
我正在使用 1.3.7 版学习 Grails,但我一直无缘无故地遇到以下语法错误: unexpected token: mapping @ line x, column y. 有一次,我通过运行“gr
我正在尝试找出这段Pascal代码的问题 function Factorial(n: integer): integer; begin if n = 0 then Result := 1
我是一名优秀的程序员,十分优秀!