CF1703E Mirror Grid 题解

给定一个矩阵,判断最少将多少个格反转后使得旋转零度,九十度,一百八十度,二百七十度相等。

枚举矩阵每个位置是 \(0\) 还是 \(1\),若已经判断过则跳过,全统 \(1\) 和全统 \(0\) 取操作数小值。

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int t,n,ans;
char a[105][105];//储存矩阵
bool vis[105][105];//判断是否枚举
int main(){
	scanf("%d",&t);
	while(t--){
		memset(vis,0,sizeof(vis));
		ans=0;
		scanf("%d",&n);
		for(int i=0;i<n;i++){
			scanf(" %s",a[i]);
		}
		for(int i=0;i<n;i++){
			for(int j=0;j<n;j++){
				int cnt1=0,cnt2=0;
				if(a[i][j]=='0'&&!vis[i][j]){//枚举全为0
					vis[i][j]=true;
					cnt1++;
					if(a[j][n-i-1]=='1') cnt2++;
					else cnt1++;
					vis[j][n-i-1]=true;
					if(a[n-i-1][n-j-1]=='1') cnt2++;
					else cnt1++;
					vis[n-i-1][n-j-1]=true;
					if(a[n-j-1][i]=='1') cnt2++;
					else cnt1++;
					vis[n-j-1][i]=true;
				}
				else if(a[i][j]=='1'&&!vis[i][j]){//枚举全为1
					vis[i][j]=true;
					cnt2++;
					if(a[j][n-i-1]=='0') cnt1++;
					else cnt2++;
					vis[j][n-i-1]=true;
					if(a[n-i-1][n-j-1]=='0') cnt1++;
					else cnt2++;
					vis[n-i-1][n-j-1]=true;
					if(a[n-j-1][i]=='0') cnt1++;
					else cnt2++;
					vis[n-j-1][i]=true;
				}
				ans+=min(cnt1,cnt2);//取更小值
			}
		}
		printf("%d\n",ans);
	}
	return 0;
}

posted @ 2022-07-15 09:02  Scorilon  阅读(195)  评论(0)    收藏  举报