感觉没有什么问题,但是就是挂掉了。。。
#include<bits/stdc++.h>
using namespace std;
const int MAXN=305;
const int MAXM=MAXN*MAXN<<1;
int n,m;
int match[MAXM],vis[MAXM];
int tim;
char s[MAXN][MAXN];
vector<int> v[MAXM];
int Get(int i,int j){ return (i-1)*m+j; }
int dirx[4]={1,-1,0,0};
int diry[4]={0,0,1,-1};
int dfs(int x)
{
if(vis[x]==tim) return 0;
vis[x]=tim;
for(auto &i:v[x])
{
if(vis[i]==tim) continue;
vis[i]=tim;
if(!match[i]||dfs(match[i]))
{
match[x]=i,match[i]=x;
return 1;
}
}
return 0;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++) cin>>s[i][j];
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(s[i][j]=='1') continue;
if((i+j)%2==0) continue;
for(int k=0;k<4;k++)
{
int tx=i+dirx[k],ty=j+diry[k];
if(tx<1||tx>n||ty<1||ty>m||s[tx][ty]=='1') continue;
int now=Get(i,j),to=Get(tx,ty);
v[now].push_back(to),v[to].push_back(now);
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(s[i][j]=='2')
{
int now=Get(i,j);
if(!match[now])
{
tim++;
if(!dfs(now))
{
puts("No");
return 0;
}
}
}
}
}
puts("Yes");
return 0;
}