题解
2024-08-05 08:16:07
发布于:上海
14阅读
0回复
0点赞
#include<iostream>
using namespace std;
const int N=1e3;
int t,n,s;
char rec[N][N];
int main(){
cin>>t;
while(t--){
cin>>n;
for(int i=0;i<n;i++)cin>>rec[i];//输入数据
s=0;
for(int i=0;i<(n+1)/2;i++){
for(int j=0;j<(n+1)/2;j++){
/*
这里我们用递推可以得知,
一个原来坐标为(i,j)的点,
顺时针旋转90°变成了(j,n-i-1)的点,
逆时针旋转90°变成了(n-j-1,i)的点,
旋转180°后变成了(n-i-1,n-j-1)的点。
也就是说,我们可以将整个二维数组划分为四个部分:左上、右上、左下、右下,
最终我们只需要判断左上部分即可同时顾虑到其他三个部分。
*/
char max_ch=max(max(rec[i][j],rec[n-i-1][n-j-1]),
max(rec[j][n-i-1],rec[n-j-1][i]));
//获取四个对称点中最大的那个字符的值
s+=(max_ch-rec[i][j])+(max_ch-rec[n-i-1][n-j-1])+
(max_ch-rec[j][n-i-1])+(max_ch-rec[n-j-1][i]);
//更新最终的结果,如果此处遇到有和最大字符相同的字符,则+0,对结果无影响
}
}
cout<<s<<endl;
}
return 0;
}
这里空空如也
有帮助,赞一个