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;
}
posted @ 2025-05-03 22:05  林晋堃  阅读(15)  评论(0)    收藏  举报