蒟蒻代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=210,M=4e4+10;
int n,m,T;
int mp[N][N],a[N][N],vis[M];
int flag[M];
vector<int>s[M];
int lx[]={0,-1,-2,1,2,-1,-2,1,2},ly[]={0,-2,-1,-2,-1,2,1,2,1};
bool dfs(int x){
for(int i=0;i<s[x].size();i++){
int y=s[x][i];
if(vis[y])continue;
vis[y]=1;
if(!flag[y]||dfs(flag[y])){
flag[y]=x;
return 1;
}
}
return 0;
}
signed main(){
ios::sync_with_stdio(NULL);cin.tie(0);cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
mp[i][j]=(i+j)%2;
}
}
string ss[n];
for(int i=0;i<n;i++){
cin>>ss[i];
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(ss[i][j]=='1'){
mp[i+1][j+1]=2;
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(mp[i][j]==0){
for(int k=1;k<=8;k++){
int new_i=i+lx[k],new_j=j+ly[k];
if(new_i>0&&new_i<=n&&new_j>0&&new_j<=n&&mp[new_i][new_j]!=2){
s[(i-1)*n+j].push_back((new_i-1)*n+new_j);
}
}
}
}
}
int ans=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(mp[i][j]==0){
memset(vis,0,sizeof(vis));
ans+=dfs((i-1)*n+j);
}
}
}
cout<<ans;
return 0;
}