[Codeforces] CF1703E Mirror Grid

发布时间 2023-12-09 17:33:30作者: crazy--boy

CF1703E Mirror Grid

题意

给定一个 \(n\times n\ (n\le100)\) 的 01 矩形,求至少修改多少次后能使矩形旋转 0°,90°,180°,270°后所形成的矩形都完全相同。

思路

吸纳分为两种情况讨论:

  • \(n\)为奇数

那么会出现这种情况:(以\(5\times 5\)为例)

img

如上图,我们就可以将其分为五个部分,每个部分都能通过旋转得到其他三个(中间的白色除外)

所以,我们只需要查看上图中黄色的部分,并且算出来它旋转若干次后的位置的坐标即可

  • \(n\)为偶数(以\(4\times 4\)为例)

img

所以划分就是上图,亦能够将其分成四个相同的部分并通过旋转得到彼此

所以,当我们枚举两张图中的黄色部分时,黄色部分中的格子做对应的旋转若干度后的格子都是已知的,那么就可以将他们加和,看看是和\(4\)接近还是和\(0\)接近(即全部变为\(1\)还是全部变为\(0\)

代码

#include<bits/stdc++.h>
using namespace std;
const int Maxn=110;
int a[Maxn][Maxn];
int n,ans;
void run()
{
	cin>>n;ans=0;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
		{
			char c;
			cin>>c;
			a[i][j]=c-'0';
		}
	for(int i=1;i<=(n+1)/2;i++)
		for(int j=1;j<=n/2;j++)
		{
			int cnt=a[i][j]+a[n-j+1][i]+a[j][n-i+1]+a[n-i+1][n-j+1];
			ans+=min(cnt,4-cnt);
//			cout<<i<<" "<<j<<" "<<ans<<endl;
		}
	cout<<ans<<endl; 
}
int main()
{
	int t;
	cin>>t;
	while(t--) run();
 }