ABC404B题解
不要问我为什么会写 B 题的题解,因为今天这场比赛我炸了,而且还被魔怔了。
在下唐氏先生,由于考场中二病发作,使用 \(\operatorname{BFS}\) 来做题,结果过了一个小时也没整出来(本人已被魔怔),其实在调的过程中也发现其实没必要这么复杂,但是我认为反正已经写了,就没必要再重新写了,反正很快就能调完,结果整了一个小时也不行。
步入正题,显而易见最优的方法肯定是先旋转 \(x(1 \le x \le 3)\) 下,然后将 \(s\) 中所有和 \(t\) 不相同的字符取反就行了,所以只需要枚举旋转多少次,然后统计一下就行了,至于旋转怎么写,自己画个图应该就懂了。
代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 105;
char s[N][N],t[N][N];
char b[N][N];
signed main()
{
int n;
scanf("%d",&n);
for(int i = 1;i<=n;i++)
{
for(int j = 1;j<=n;j++)
{
cin >> s[i][j];
}
}
for(int i = 1;i<=n;i++)
{
for(int j = 1;j<=n;j++)
{
cin >> t[i][j];
}
}
for(int i = 1;i<=n;i++)
{
for(int j = 1;j<=n;j++)
{
b[j][n-i+1] = s[i][j];
}
}
int minn = 1e9;
for(int i = 0;i<4;i++)
{
int num = 0;
for(int i = 1;i<=n;i++)
{
for(int j = 1;j<=n;j++)
{
num+=(s[i][j]!=t[i][j]);
}
}
minn = min(minn,num+i);
for(int i = 1;i<=n;i++)
{
for(int j = 1;j<=n;j++)
{
b[j][n-i+1] = s[i][j];
}
}
for(int i = 1;i<=n;i++)
{
for(int j = 1;j<=n;j++)
{
s[i][j] = b[i][j];
}
}
}
printf("%d",minn);
return 0;
}

浙公网安备 33010602011771号