题意:给你一个n*n的矩阵,n为奇数,以最中心的一个数为基准,可以把这个矩阵 看成一圈一圈的,每一圈都可以逆时针或者顺时针旋转,每一次旋转每个元素只能移动一个单元格,求经过每一圈的旋转矩阵两个对角线和最大的值,并求出最少旋转次数
一圈一圈的处理,注意最中心的那个数不用管,就它一个,那么这个矩阵只有n/2圈需要操作,对于每一圈的元素都放在一个一维数组里面,然后枚举这个数组里的每一个元素为开头,统计接下来的三个数,求和比较大小即可,因为有逆时针的,所以顺时针时从开头开始枚举,逆时针则从尾部开始枚举,这题数据貌似有些烂,
int n;
int mp[15][15];
void init() {
memset(mp,0,sizeof(mp));
}
bool input() {
while(cin>>n,n) {
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
cin>>mp[i][j];
return false;
}
return true;
}
void cal() {
int ans = 0;
int cnt = 0;
int nnum = n/2;
int aa[100 + 55];
for(int k=0;k<nnum;k++) {
memset(aa,0,sizeof(aa));
int pos = 0;
int sum = 0;
int now = 0;
for(int j=k;j<n - k;j++)aa[pos++] = mp[k][j];
for(int i=k + 1;i<n - k;i++)aa[pos++] = mp[i][n - k - 1];
for(int j=n - k - 2;j >k;j--)aa[pos++] = mp[n - k - 1][j];
for(int i=n - k - 1;i>k;i--)aa[pos++] = mp[i][k];
for(int i=0;i<=(pos + 1)/2;i++) {
int tmp = 0;
tmp = aa[i%pos] + aa[(i+(n-2*k-1))%pos] + aa[(i+2*(n-2*k-1))%pos] + aa[(i+3*(n-2*k-1))%pos];
if(tmp > sum) {
sum = tmp;
now = i;
}
if(tmp == sum) {
if(i < now)
now = i;
}
}
for(int i=pos-1,mark = 0;mark <=(pos+1)/2;i--) {
int tmp = 0;
tmp = aa[i%pos] + aa[(i+(n-2*k-1))%pos] + aa[(i+2*(n-2*k-1))%pos] + aa[(i+3*(n-2*k-1))%pos];
if(tmp > sum) {
sum = tmp;
now = pos - i;
}
if(tmp == sum) {
if(pos - i < now)
now = pos - i;
}
mark++;
}
ans += sum;
cnt += now;
}
ans += mp[n/2][n/2];
cout<<ans<<" "<<cnt<<endl;
}
void output() {
}
int main() {
while(true) {
init();
if(input())return 0;
cal();
output();
}
return 0;
}