Description | ||
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 |
这题可以先按要求转动,然后找到每次转动的子矩阵中的最大值并记录,依此循环转动12次(转12次为一圈)因此俩个函数,一个转动,一个找最大值。我的代码中利用了一个cjz数组来暂时保存原矩阵,俩个矩阵然后假模拟旋转,对于 for(int i=0;i<3;i++){
cjz[0][i+1] = jz[0][i];
cjz[i+1][3] = jz[i][3];
} 这个循环,因为默认顺时针转,所以第一行(i=0)的数向右走(所以是cjz[][i+1] = jz[][i],后面那个等于前面那个,就是向右走了,可以在纸上写一下)此时走完后,cjz数组把第一行1-3(第0个数会在后面被赋值)的记录;最后一列[][这里是3]向下走,当全部转完后再把cjz复制给原矩阵就好了
#include<stdio.h>
void cycle(int jz[4][4],int cjz[4][4]);//转动
int MAX(int jz[4][4],int max);//找子矩阵最大值
int main()
{
int t;
scanf("%d", &t);
while(t--){
int max=0;
int jz[4][4] = {0};
int cjz[4][4] = {0};
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
scanf("%d", &jz[i][j]);
cjz[i][j] = jz[i][j];
}
}
for(int i=0;i<12;i++){
cycle(jz,cjz);//转动1格
max = MAX(jz,max);//找max
}
printf("%d\n", max);
}
return 0;
}
void cycle(int jz[4][4],int cjz[4][4])
{//顺逆一样,默认顺
for(int i=0;i<3;i++){//第0行向右;第三列向下;
cjz[0][i+1] = jz[0][i];
cjz[i+1][3] = jz[i][3];
}
for(int i=3;i>0;i--){
cjz[3][i-1] = jz[3][i];
cjz[i-1][0] = jz[i][0];
}
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
jz[i][j] = cjz[i][j];
}
}
}
int MAX(int jz[4][4],int max)
{
for(int i=0;i<=2;i++){
for(int j=0;j<=2;j++){
int d = jz[i][j]+jz[i][j+1]+jz[i+1][j]+jz[i+1][j+1];
if(d>max)max=d;
}
}
return max;
}