题目:3565. 完美矩阵
题解:会发现当你判断a[1][1]的时候,a[n][i]、a[1][m]、a[n][m]都应该和a[1][1]相等,也就是说只需考虑矩阵nm的左上半部分即可。然后对这几个数看移动多少次可以让他们都相等。这个等价于货仓寻址问题,将这几个数排序,然后去中值即可。
特殊点:就是考虑的点的情况有三种:1、2、4。这也我上面为什么不直接说4个而是说“这几个”的原因。解决这个问题也很简单,就是用一个set集合去去重,然后将这几个数加入到vector里,用sort排序就可以很快速的找到中值
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int ,int> PII;
const int N=1010;
const int mod=100000007;
int t,n,m;
int a[110][110];
int main(){
cin>>t;
while(t--){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
}
}
LL sum=0;
for(int i=1;i<=n-i+1;i++){
for(int j=1;j<=m-j+1;j++){
set<PII> st;
st.insert({i,j});
st.insert({i,m-j+1});
st.insert({n-i+1,j});
st.insert({n-i+1,m-j+1});
vector<int > vt;
for(auto t:st){
vt.push_back(a[t.first][t.second]);
}
sort(vt.begin(),vt.end());
for(int k=0;k<vt.size();k++){
sum+=abs(vt[k]-vt[vt.size()/2]);
}
}
}
cout<<sum<<endl;
}
return 0;
}