和1467 Pick Up Points一模一样。
求最大匹配即可。
稍微小改下代码就ac了。
好的思想是:match数组记录的是匹配的方向。
bool find(int fx,int fy)
{
int x,y,i;
for(i=0;i<4;++i)
{
x=fx+dir[i][0];
y=fy+dir[i][1];
if((map[x][y]==map[fx][fy])&&!used[x][y])
{
used[x][y]=true;
if(match[x][y]==-1||find(x-dir[match[x][y]][0],y-dir[match[x][y]][1]))
{
match[x][y]=i;//很巧妙的一个地方记下匹配的方向,而不是点的坐标,省空间
return true;
}
}
}
return false;
}