1 条题解

  • 0
    @ 2025-11-22 19:28:11

    首先不难发现,

    • 旋转 9090^∘ 时,ai,ja_{i,j}​=aj,ni+1a_{j,n−i+1}
    • 旋转 180180^∘ 时,ai,ja_{i,j}​=ani+1,nj+1a_{n−i+1,n−j+1}(上下颠倒左右翻转)
    • 旋转 270270^∘ 时,ai,ja_{i,j}​=anj+1,ia_{n−j+1,i}

    考虑贪心:遍历矩阵,每次答案加上 ai,ja_{i,j}aj,ni+1a_{j,n−i+1}ani+1,nj+1a_{n−i+1,n−j+1}anj+1,ia_{n−j+1,i} 全部变 1 的修改次数和全部变 0 的修改次数的较小值。 但是如果直接遍历矩阵,会导致重复计算(ai,ja_{i,j}aj,ni+1a_{j,n−i+1}ani+1,nj+1a_{n−i+1,n−j+1}anj+1,ia_{n−j+1,i} 每个点都会增加一次答案,总共计算四次)。第一是通过观察确定遍历范围或者直接在矩阵上修改,这里不再赘述。第二是因为每个点都计算了四次,直接把最终答案除以 4 即可

    #include <bits/stdc++.h>
    using namespace std;
    int t,n;
    char c;
    int a[101][101];
    int main(){
        cin>>t;
        while (t--){
            cin>>n;
            int ans=0;
            for (int i=1;i<=n;i++){
                for (int j=1;j<=n;j++){
                    cin>>c;//注意输入方式
                    a[i][j]=c-48;//转换为整数的形式
                }
            }
            for (int i=1;i<=n;i++){
                for (int j=1;j<=n;j++){
                    int cnt=a[i][j]+a[j][n-i+1]+a[n-i+1][n-j+1]+a[n-j+1][i];//统计有几个1
                    ans+=min(cnt,4-cnt);//比较1和0的个数,谁少改谁
                }
            }
            cout<<ans/4<<endl;
        }
        return 0;
    }
    
    • 1

    时间过的真快啊!有到了说再见的时候了

    信息

    ID
    1218
    时间
    1000ms
    内存
    256MiB
    难度
    7
    标签
    (无)
    递交数
    32
    已通过
    9
    上传者