题意:
一个n×n(n为奇数)的矩阵,每一圈可以每次顺时针或者逆时针转一格,求最大的两条对角线上的数字和,且求最少的转动次数。
题解:
对于格子(i,j)其它三个和它会同时在对角线上的格子是(j,n-i-1) (n-i-1,n-j-1) (n-j-1,i)。直接加就行。
//Time:15ms
//Memory:368KB
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
using namespace std;
const int MAXN= 20;
const double EPS = 1e-8;
const double INF = 1e50;
long long ma[MAXN][MAXN];
int main()
{
//freopen("/home/moor/Code/input","r",stdin);
int n;
long long a,b;
while(scanf("%d",&n)&&n)
{
a=0,b=0;
for(int i=0;i<n;++i)
for(int j=0;j<n;++j) cin>>ma[i][j];
for(int i=0;i<n;++i)
{
long long tmp=0,len=0,tt;
for(int j=i;j<n-1-i;++j)
{
tt=ma[i][j]+ma[j][n-i-1]+ma[n-i-1][n-j-1]+ma[n-j-1][i];
if(tt>tmp) tmp=tt,len=min(j-i,n-j-1-i);
else if(tt==tmp) len=min(len,(long long)min(j-i,n-j-1-i));
}
a+=tmp,b+=len;
}
a+=ma[n/2][n/2];
cout<<a<<' '<<b<<'\n';
}
return 0;
}