C. Palindromic Paths(回文路径+思维)

Input

The first line contains one integer t (1≤t≤200) — the number of test cases.

The first line of each test case contains two integers n and m(2≤n,m≤30) — the dimensions of the matrix.

Then n lines follow, the i-th line contains m integers ai,1ai,1, ai,2ai,2, ..., ai,mai,m (0≤ai,j≤10≤ai,j≤1).

Output

For each test case, print one integer — the minimum number of cells you have to change so that every path in the matrix is palindromic.

 有一张m*n的 01 图,要求判断更改几次才能将从(1,1)点到(n,m)点的所有路径都变成回文路径(回文路径是第1步与倒数第1步上的元素相同,第二步如此,以此类推)

我们将每一步都看成一个集合,只需要比较所有的第一步和所有的倒数第一步全为1或全为0的最小值即可

#pragma GCC optimize(2)
#include 
#define rush() int T;cin>>T;while(T--)
#define go(a) while(cin>>a)
#define ms(a,b) memset(a,b,sizeof a)
#define E 1e-8
#define debug(a) cout<<"*"< Pair;
const int inf=0x3f3f3f3f;
const int N=50+5;

    int n,m,t;
    int i,j,k;
    int a[N][N];
    int vis[N+N][2];//vis[i][0]表示第 i 步,位置为 0 的点有多少 

int32_t main()
{
    IOS; string s;
    rush(){
        cin>>n>>m;
        int ans=0; ms(vis,0);
        for(i=1;i<=n;i++){
            for(j=1;j<=m;j++){
                cin>>a[i][j];
                int num=i+j-2;
                vis[num][a[i][j]]++;
            }
        }
        for(i=0,j=n+m-2;j>i;i++,j--){
            ans+=min(vis[i][0]+vis[j][0],vis[i][1]+vis[j][1]);
        }
        cout<

 

你可能感兴趣的:(CF)