如以下代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int MAXE = 800010;
const int MAXN = 80010;
bool vis[MAXN];
char str[210][210];
int n,k,tot,wzq,sm,x[MAXN],y[MAXN],to[MAXE],nxt[MAXE],head[MAXN],mat[MAXN];
int dx[10]={-1,-2,1,2,-1,-2,1,2};
int dy[10]={-2,-1,-2,-1,2,1,2,1};
inline int id(int x,int y) { return n*(x-1)+y; }
inline void add(int a,int b){
nxt[++tot]=head[a];
head[a]=tot;
to[tot]=b;
}
bool fd(int x){
for(int i=head[x];i;i=nxt[i]){
int y=to[i];
if(vis[y]) continue;
vis[y]=true;
if(!mat[y] || fd(mat[y])){
mat[y]=x;
return true;
}
}
return false;
}
signed main(){
cin>>n;
for(int i=1;i<=n;i++){
scanf("%s",str[i]+1);
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
sm+=(str[i][j]=='0');
if(str[i][j]=='0' && i%2==j%2){
for(int kk=0;kk<8;kk++){
int xx=i+dx[kk];
int yy=j+dy[kk];
if(xx>=1 && xx<=n && yy>=1 && yy<=n && str[xx][yy]!='1'){
add(id(i,j),id(xx,yy));
}
}
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(str[i][j]=='0' && i%2==j%2){
memset(vis,0,sizeof(vis));
wzq+=fd(id(i,j));
}
}
}
cout<<sm-wzq;
}
其中 id 函数误写成以下形式:
inline int id(int x,int y) { return (n-1)*x+y; }
但仍有 80 分。
正确写法为
inline int id(int x,int y) { return (x-1)*n+y; }
改正前记录:link
改正后记录:link
另:在其他 OJ 上的自造数据里改正前的代码会得 0 分。
以下图为更正前后 id 函数的输出结果,左为更正前,右为更正后。

当然,如果我理解上有问题,大佬们也请轻喷qwq