题解:P12657 [KOI 2023 Round 1] 两个正三角形

· · 题解

分析

首先看旋转。

如果转 3 圈,那么就转了 3\times120 度,就又回来了。

再看对称变换。

如果转 2 次,那么就转了 2\times180 度,也回来了。

所以就只要操作 2\times3 次。

所以暴力就可以了。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int n,a[12][12],b[12][12],c[12][12],ans=INT_MAX;
void f1(){//旋转  
    for(int i=1;i<=n;i++){
        for(int j=1;j<=i;j++){
            c[n-i+j][n-i+1]=a[i][j];
        }
    }
    memcpy(a,c,sizeof(c));
    return;
}
void f2(){//对称
    for(int i=1;i<=n;i++){
        for(int j=1;j<=i;j++){
            c[i][i-j+1]=a[i][j];
        }
    }
    memcpy(a,c,sizeof(c));
    return; 
}
int check(){//计算答案
    int sum=0;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=i;j++){
            if(a[i][j]!=b[i][j]) sum++;
        }
    }
    return sum;
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=i;j++){
            cin>>a[i][j];
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=i;j++){
            cin>>b[i][j];
        }
    }
    ans=check();
    for(int i=1;i<=3;i++){//暴力
        f1();
        for(int j=1;j<=2;j++){
            f2();
            ans=min(ans,check());
        }
    }
    cout<<ans;
    return 0;
}