A
签到题。
$x$ 有 $1$ 那么答案就是 $|x-y|$ 。
$x$ 为 $0$ 时,若 $y$ 为 $0$ 则输出 $0$ ,反之输出 $-1$ 。
D
可以推出满足题目中条件时,方阵要么全是 $1$ 要么全是 $0$ 。
那么有解的情况就是每行/列都是互逆的两种形态。
取操作次数最少的情况即可。
#include<bits/stdc++.h>
#define N 2010
#define INF 1e8
using namespace std;
int n,ans=INF;
string a[N];
void work() {
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
bitset<2000> r[n],c[n];
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++) r[i][j]=c[j][i]=(a[i][j]-'0');
}
vector<bitset<2000> > v;
v.push_back(r[0]);
bool flag=true;
for(int i=1;i<n;i++) {
if(r[i]==v[0]) continue;
if(r[i]!=v[0]&&v.size()==1) v.push_back(r[i]);
if(v.size()==2) {
if(r[i]==v[1]) continue;
else {
flag=false;
break;
}
}
}
if(flag) {
if(v.size()==1) ans=min(ans,min((int)(n-r[0].count()),(int)r[0].count()));
else if(v.size()==2) {
if((v[0]^v[1]).count()==n) {
int cnt1=0,cnt2=0;
for(int i=0;i<n;i++) {
if(r[i]==v[0]) cnt1++;
else if(r[i]==v[1]) cnt2++;
}
ans=min(ans,(int)min(min(cnt1+n-v[1].count(),cnt1+v[1].count()),min(cnt2+n-v[0].count(),cnt2+v[0].count())));
}
}
}
v.clear();
v.push_back(c[0]);
flag=true;
for(int i=1;i<n;i++) {
if(c[i]==v[0]) continue;
if(c[i]!=v[0]&&v.size()==1) v.push_back(c[i]);
if(v.size()==2) {
if(c[i]==v[1]) continue;
else {
flag=false;
break;
}
}
}
if(flag) {
if(v.size()==1) ans=min(ans,min((int)(n-c[0].count()),(int)c[0].count()));
else if(v.size()==2) {
if((v[0]^v[1]).count()==n) {
int cnt1=0,cnt2=0;
for(int i=0;i<n;i++) {
if(c[i]==v[0]) cnt1++;
else if(c[i]==v[1]) cnt2++;
}
ans=min(ans,(int)min(min(cnt1+n-v[1].count(),cnt1+v[1].count()),min(cnt2+n-v[0].count(),cnt2+v[0].count())));
}
}
}
if(ans==INF) cout<<"-1\n";
else cout<<ans<<endl;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
work();
}