题意
给你一个n*m的01矩阵,需要你从左上走到右下,只能向下,向右走。
问最少要改多少个格子,才能让所有走的路径都是回文串。
思路
因为是回文串需要前后对称,并且每条路总步数相同为(n+m-2),设点到1要走x步,所有步数为x和n+m-2-x
的点要相同(左右对称)。
其实只要斜着遍历数组(前后一起) 选择0和1数量少的加入答案。
#include<bits/stdc++.h>
using namespace std;
const int N = 100;
int ans[N][2];
void solve()
{
memset(ans,0, sizeof ans);
int n,m;
cin >> n>> m;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
int x;
cin >> x;
ans[i+j][x]++; //斜的数组的01数量
}
int res = 0;
for(int i=0,j=n+m-2; i<j; i++, j--)
res += min(ans[i][0]+ans[j][0], ans[i][1]+ans[j][1]);
cout << res << endl;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
int t;
cin >> t;
while(t--)
solve();
return 0;
}
我居然倒在了斜着遍历数组上