Rotate Again
题目描述
一个4×4的矩阵,我们可以把矩阵看成内外两圈,我们可以把外圈按顺时钟或者逆时钟转动,每次转动一个格子。 我们想得到一个2×2的子矩阵,使得这个子矩阵4个元素的累加和最大。请问最大子矩阵的元素累加和是多少?
输入
第一行是一个整数T(1≤T≤1000),表示样例的个数。 每个样例占4行,每行4个整数,所有元素在[1,1000]范围内。
输出
每行输出一个样例的结果。
样例输入
2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1 1 2 2 3 3 4 4 2 2 1 1 4 4 3 3
样例输出
56 15
提示
第一个样例,逆时钟旋转1格,得到最大子矩阵为
11 16 14 15
第二个样例,逆时钟旋转5格,得到最大子矩阵为
3 4 4 4
AC 代码
#include<stdio.h>
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int max=0;
int a[4][4];
int i,j;
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
scanf("%d",&a[i][j]);
}
}//利用二维数组输入矩阵
int num=12;//转动12次后回到原位
int tempt;
int b;
while(num--)
{
b=a[0][3];
for(i=2;i>=0;i--)
{
a[0][i+1]=a[0][i];
//顺时针与逆时针实质上是相同的
}
for(i=0;i<3;i++)
{
a[i][0]=a[i+1][0];
}
for(i=0;i<3;i++)
{
a[3][i]=a[3][i+1];
}
for(i=2;i>=0;i--)
{
a[i+1][3]=a[i][3];
}
a[1][3]=b;//按顺序转动
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
tempt=a[i][j]+a[i+1][j+1]+a[i+1][j]+a[i][j+1];
if(tempt>max)
{
max=tempt;
}
}
}
}
printf("%d\n",max);
}
return 0;
}
编程小白,希望与大家一起交流进步!