1 条题解

  • 0
    @ 2025-2-14 21:30:05

    C++ :

    #include<iostream>
    using namespace std;
    int n,m,ans(0),a[5005][10],match[5005],x=0,y=0,num[10005];
    bool used[5005],can[10005];
    void init()
    {
    	cin>>n>>m;
    	fill(can,can+10005,1);
    	for (int i=1,b,c;i<=m;i++)
        {
        cin>>b>>c;
        can[(b-1)*n+c]=false;
        }
        for (int i=1;i<=n;i++)
        for (int j=1;j<=n;j++)
        if ((i+j)%2==0&&can[(i-1)*n+j]) num[(i-1)*n+j]=(++y);
        for (int i=1;i<=n;i++)
        for (int j=1;j<=n;j++)
        {
        	if ((i+j)%2==1&&can[(i-1)*n+j])
        	{
    		    a[++x][0]=0;
    		    if (can[(i-1)*n+j-1]&&j-1>0)
    		    a[x][++a[x][0]]=num[(i-1)*n+j-1];
    		    if (can[(i-1)*n+j+1]&&j+1<=n)
    		    a[x][++a[x][0]]=num[(i-1)*n+j+1];
    		    if (can[(i-2)*n+j]&&i-2>=0)
                a[x][++a[x][0]]=num[(i-2)*n+j];
                if (can[(i)*n+j]&&i<n)
                a[x][++a[x][0]]=num[(i)*n+j];
            }
        
    }
    }
    bool cross(int k)
    {
    	if (!k) return false;
    	for (int i=1;i<=a[k][0];i++)
    	{
    		int j=a[k][i];
    		if (!used[j])
    		{
    			used[j]=true;
    			if (!match[j]||cross(match[j]))
                {
                 match[j]=k;
                 return true;
                }
    		}
    	}
    	return false;
    }
    void solve()
    {
    	for (int i=1;i<=x;i++)
    	{
    		if (cross(i))
    		ans++;
    		fill(used,used+5005,0);
    	}
    }
    int main()
    {
    	init();
    	solve();
    	cout<<ans<<endl;
    	return 0;
    }
    
    • 1

    信息

    ID
    954
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者