P12657 [KOI 2023 Round 1] 两个正三角形 题解
题意
对于一个正三角形,求其通过旋转和对称变换所得的
思路
一道简单的模拟题。
将
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;
}