第一个点与第十个点TLE。
#include<bits/stdc++.h>
using namespace std;
int to[50005],nxt[50005],head[50005];
int vis[50005],use[50005];
int oer[50005];
const int dx[]={3,3,1,1,-3,-3,-1,-1},dy[]={1,-1,3,-3,1,-1,3,-3};
int top;
void add(int now,int tow){
to[++top]=tow;
nxt[top]=head[now];
head[now]=top;
}
bool dfs(int x){
for (int i=head[x];i;i=nxt[i]){
int ver=to[i];
if(!vis[ver]){
vis[ver]=1;
if(use[ver]==0||dfs(use[ver])){
use[ver]=x;
use[x]=ver;
return 1;
}
}
}
return 0;
}
int main(){
int n,m;
int k;
scanf("%d%d%d",&n,&m,&k);
int x,y;
int tmp=0;
for(int i=1;i<=k;i++){
scanf("%d%d",&x,&y);
if(!oer[x*m-m+y])oer[x*m-m+y]=1;
else{
tmp++;
}
}
for(int i=2;i<=n;i+=2){
for(int j=1;j<=m;j++){
if(oer[i*m-m+j])continue;
for(int k=0;k<8;k++){
x=i+dx[k];
y=j+dy[k];
if(x>0&&x<=n&&y>0&&y<=m&&!oer[(x-1)*m+y]){
add((i-1)*m+j,(x-1)*m+y);
}
}
}
}
int sum=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(dfs((i-1)*m+j)){sum++;}
memset(vis,0,sizeof(vis));
}
}
cout<<n*m-sum-k+tmp;
}