XTU oj 1412 Rotate again

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

        这个小矩阵的组成情况只有三种:1.内部四个数  2.内部两个数加上外部两个数  3.内部一个数加上外部三个数

        可以发现,无论怎么转,外部的每一个数总是会经过内部的每一个数,所以只需要找出内部最大的一个数、连续最大的两个数,以及外部连续最大的两个数、连续最大的三个数,并把它们分别相加就好,类似于之前的最大子段和问题。

#include <stdio.h>
int main (){
	int T,t;
	int out[12]={0};
	int in[4]={0};
	scanf ("%d",&T);
	while (T--){
		//输入 
		int cnt,i;
		int max=0,max0=0,max2=0,max3=0;
		int maxn1=0,maxn2=0; 
		scanf ("%d %d %d %d",&out[0],&out[1],&out[2],&out[3]);
		scanf ("%d %d %d %d",&out[11],&in[0],&in[1],&out[4]);
		scanf ("%d %d %d %d",&out[10],&in[3],&in[2],&out[5]);
		scanf ("%d %d %d %d",&out[9],&out[8],&out[7],&out[6]);
		//挪动外圈 
		for (cnt=0;cnt<12;cnt++){
			t=out[11];//我这里是顺时针转动,所以先把out【11】存起来,以免被out【10】覆盖后丢失
			for (i=10;i>=0;i--){
				out[i+1]=out[i];
			}
			out[0]=t;//把之前的out【11】放到out【0】的位置上
			if (out[0]+out[1]+out[2]>max3) max3=out[0]+out[1]+out[2];//外面那连续三个数最大和
			if (out[0]+out[1]>max2) max2=out[0]+out[1]; //外边连续两个数最大和
		}
		 	//判断内部最大
			 for (i=0;i<4;i++){
			 	if (in[i]>maxn1) maxn1=in[i];//内部一个最大数
			 	if (in[i]+in[(i+1)%4]>maxn2) maxn2=in[i]+in[(i+1)%4];//内部连续两个数最大和。这里对4取模,当i=3时,与in【3】配对的就是in【0】,省去分类讨论
			 }
		//情况一:外圈3+内圈1
			max3+=maxn1;
		//情况二:外圈2+内圈2
			max2+=maxn2;
		//情况三:内圈4;
			max0=in[0]+in[1]+in[2]+in[3];
		
		//判定三种情况的最大值
		if (max3>=max2&&max3>=max0) max=max3;
		else if (max2>=max3&&max2>=max0) max=max2;
		else if (max0>=max2&&max0>=max3) max=max0;
		
		printf ("%d\n",max);
				 
	}
	return 0;
}

  • 8
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值