题目描述
一个4×4的矩阵,我们可以把矩阵看成内外两圈,我们可以把外圈按顺时钟或者逆时钟转动,每次转动90度。 我们想得到一个2×2的子矩阵,使得这个子矩阵4个元素的累加和最大。请问最大子矩阵的元素累加和是多少?
输入
3
1 2
2 5
1 1000000000000000000
输出
54
14
思路
题目说可以把矩阵的外围元素按逆时针或者顺时针转圈,从而可以取得4个元素的最大值,
于是我们可以创立四个数组,用做每一个元素的移动,即可。
代码如下
#include<stdio.h>int
he(int arr[6][6]){
int biao[10] = { 0 };
int sum = 0;
int count = 0;
for (int i = 1; i <= 3; i++)
{
for (int j = 1; j <= 3; j++)
{
biao[count] = arr[i][j] + arr[i + 1][j] + arr[i][j + 1] + arr[i + 1][j + 1];
count++;
}
}
int max = biao[0];
for (int i = 1; i < count; i++)
{
if (biao[i] > max)max = biao[i];
}
return max;
}void rotate(int arr[6][6])
{
int str1[6] = { 0 };
int str2[6] = { 0 };
int str3[6] = { 0 };
int str4[6] = { 0 };
for (int j = 1; j <= 4; j++)str1[j] = arr[1][j];
for (int i = 1; i <= 4; i++)str2[i] = arr[i][1];
for (int j = 1; j <= 4; j++)str3[j] = arr[4][j];
for (int i = 1; i <= 4; i++)str4[i] = arr[i][4];
int cnt = 4;
int count = 4;
for (int j = 1; j <= 4; j++)arr[1][j] = str2[cnt--];
for (int i = 1; i <= 4; i++)arr[i][4] = str1[i];
for (int j = 1; j <= 4; j++)arr[4][j] = str4[count--];
for (int i = 1; i <= 4; i++)arr[i][1] = str3[i];}
int main()
{
int T;
scanf("%d", &T);
while (T--)
{
int arr[6][6] = { 0 };
for (int i = 1; i <= 4; i++)
{
for (int j = 1; j <= 4; j++)
{
scanf("%d", &arr[i][j]);
}
}
int ling[6] = { 0 };
for (int i = 1; i <= 4; i++)//最多可以转四次,比一下就好了
{
ling[i] = he(arr);
rotate(arr);
}
int max = ling[1];
for (int i = 2; i <= 4; i++)
{
if (ling[i] > max)max = ling[i];
}
printf("%d\n", max);
}