C++代码
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=110;
int n,t;
bool g[N][N];
bool st[N][N];
pair<int,int> match[N][N];
bool find(int x,int y)
{
int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
for(int i=0;i<4;i++)
{
int cur_x=x+dx[i],cur_y=y+dy[i];
if(cur_x>=1&&cur_x<=n&&cur_y>=1&&cur_y<=n&&
!g[cur_x][cur_y]&&!st[cur_x][cur_y])
{
st[cur_x][cur_y]=true;
if(match[cur_x][cur_y].first==0||
find(match[cur_x][cur_y].first,match[cur_x][cur_y].second))
{
match[cur_x][cur_y]={x,y};
return true;
}
}
}
return false;
}//find
int main(void)
{
scanf("%d%d",&n,&t);
while(t--)
{
int x,y;
scanf("%d%d",&x,&y);
g[x][y]=true;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
match[i][j]={0,0};
int res=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(((i+j)%2==1)&&!g[i][j])
{
memset(st,false,sizeof st);
if(find(i,j)) res++;
}
printf("%d\n",res);
return 0;
}