解析:
迴文路徑,如上圖所示 兩條紅線對應的元素必須都是一樣的,兩條綠線對應的元素必須是一樣的(如果不相同其中一條路徑肯定不會是迴文路徑)。
所以最終我們只要求所有的斜線對應的元素是否一樣,不一樣我們就統計這兩條斜線1的數量和0的數量,哪個最少我們就改哪個。
但是遍歷斜線又很麻煩。我們可以根據座標(x,y)來統計 走到第幾步就是x+y-1
那麼第x+y-1 的貢獻就是 cnt[x+y-1][a[x][y]]++
最後遍歷相對應斜線的走的是第幾步來計算答案
#include<bits/stdc++.h>
using namespace std;
const int N=500;
int t,n,m;
int a[N][N];
int cnt[N][2];
int main()
{
cin>>t;
while(t--)
{
cin>>n>>m;
memset(cnt,0,sizeof cnt);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
cnt[i+j-1][a[i][j]]++;
}
int l=1,r=n+m-1;
int ans=0;
while(l<r)
{
ans+=min(cnt[l][0]+cnt[r][0],cnt[l][1]+cnt[r][1]);
l++;r--;
}
cout<<ans<<endl;
}
}