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

· · 题解

\huge 题目传送门

题意

对于一个正三角形,求其通过旋转和对称变换所得的 6 种数组与 B 数组数值不同的位置的数量的最小值。

思路

一道简单的模拟题。

A 数组翻转两次,分别与 B 数组比较。\ 再对称变换后,翻转两次,分别与 B 数组比较。

code

#include<bits/stdc++.h>
using namespace std;
int n,b[15][15],ans=INT_MAX;
void contrast(int w[15][15]){//比较函数
    int sum=0;
    for(int i=1;i<=n;i++) for(int j=1;j<=i;j++) if(w[i][j]!=b[i][j]) sum++;
    ans=min(ans,sum);
}
int main(){
    scanf("%d",&n);
    int a[15][15],a1[15][15],a2[15][15];//通过旋转获得的
    for(int i=1;i<=n;i++) for(int j=1;j<=i;j++) scanf("%d",&a[i][j]);
    for(int i=1;i<=n;i++) for(int j=1;j<=i;j++) scanf("%d",&b[i][j]);
    contrast(a);
    for(int j=n,x=1;j>=1;j--,x++) for(int i=j,y=1;i<=n;i++,y++) a1[x][y]=a[i][j];//旋转一次
    contrast(a1);
    for(int j=n,x=1;j>=1;j--,x++) for(int i=j,y=1;i<=n;i++,y++) a2[x][y]=a1[i][j];//旋转两次
    contrast(a2);
    int c[15][15],c1[15][15],c2[15][15];//通过1次对称变换和旋转获得的
    for(int i=1;i<=n;i++) for(int j=1;j<=i;j++) c[i][j]=a[i][i-j+1];//对称变换
    contrast(c);
    for(int j=n,x=1;j>=1;j--,x++) for(int i=j,y=1;i<=n;i++,y++) c1[x][y]=c[i][j];//旋转一次
    contrast(c1);
    for(int j=n,x=1;j>=1;j--,x++) for(int i=j,y=1;i<=n;i++,y++) c2[x][y]=c1[i][j];//旋转两次
    contrast(c2);
    printf("%d",ans);
    return 0;
}