为防止广告,目前nocow只有登录用户能够创建新页面。如要创建页面请先登录/注册(新用户需要等待1个小时才能正常使用该功能)。

Sgu/190

来自NOCOW
< Sgu
跳转到: 导航, 搜索

无聊的匹配……

 
有点意思的题。。
/by Logic
#include<stdio.h>
#include<string.h>
const int maxn=45;
int n,p,ansh=0,ansv,ans[maxn*maxn];
int vis[maxn][maxn]={0},s[2]={0},z=0;
int f[maxn*maxn]={0};
bool vism[maxn*maxn]={0};
int di[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
void dfs(int x,int y,int c)
{
	int i;
	vis[x][y]=c;
	s[c-1]++;
	for(i=0;i<4;i++)
	{
		int xi=x+di[i][0],yi=y+di[i][1];
		if(0<xi&&xi<=n&&0<yi&&yi<=n&&vis[xi][yi]!=-1)
		{
			if(!vis[xi][yi])
				dfs(xi,yi,(c&1)+1);
			else if(vis[xi][yi]==vis[x][y]) {z=1;return ;}
		}
	}
}
bool match(int now)
{
	int i,j,x=now/maxn,y=now%maxn;
	if(vism[now]) return 0;
	vism[now]=1;
	for(i=0;i<4;i++)
	{
		int xi=x+di[i][0],yi=y+di[i][1];
		if(0<xi&&xi<=n&&0<yi&&yi<=n&&vis[xi][yi]!=-1&&(!f[xi*maxn+yi]||match(f[xi*maxn+yi])))
			{
				f[xi*maxn+yi]=x*maxn+y;
				return 1;
			}
	}
	return 0;
}
int main()
{
#ifndef ONLINE_JUDGE
	freopen("data.in","r",stdin);
#endif
	int i,j,x,y;
	scanf("%d%d",&n,&p);
	for(i=0;i<p;i++)
		scanf("%d%d",&x,&y),vis[x][y]=-1;
	for(i=1;i<=n;i++)
		for(j=1;j<=n;j++)
			if(!vis[i][j])
				dfs(i,j,1);
	//printf("%d %d\n",s[0],s[1]);
	if(z||s[0]!=s[1]) {printf("No\n");return 0;}
	for(i=1;i<=n;i++)
		for(j=1;j<=n;j++)
			if(vis[i][j]==1)
			{
				memset(vism,0,sizeof(vism));
				if(!match(i*maxn+j)) {z=1;break;}
			}
	if(z) {printf("No\n");return 0;}
	for(i=1;i<=n;i++)
		for(j=1;j<=n;j++)
			if(f[i*maxn+j]==(i+1)*maxn+j)
				ans[ansh++]=i*maxn+j;
			else if(f[i*maxn+j]==(i-1)*maxn+j)
				ans[ansh++]=(i-1)*maxn+j;
	ansv=ansh;
	for(i=1;i<=n;i++)
		for(j=1;j<=n;j++)
			if(f[i*maxn+j]==i*maxn+j+1)
				ans[ansv++]=i*maxn+j;
			else if(f[i*maxn+j]==i*maxn+j-1)
				ans[ansv++]=i*maxn+j-1;
	printf("Yes\n%d\n",ansh);
	for(i=0;i<ansh;i++)
		printf("%d %d\n",ans[i]/maxn,ans[i]%maxn);
	printf("%d\n",ansv-ansh);
	for(i=ansh;i<ansv;i++)
		printf("%d %d\n",ans[i]/maxn,ans[i]%maxn);
	return 0;
}
//我猥琐的用了STL。
//BY Noise
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
const int gt[4][2]={{-1,0},{0,-1},{1,0},{0,1}};
struct pr{int x,y;};
vector <pr> bk,wt;
int map[42][42],n,p,dx[42][42],dy[42][42];
bool bl[42][42];
bool find(int x,int y)
{
	for(int i=0;i<4;i++){
	  int x1=x+gt[i][0],y1=y+gt[i][1];
	  if(map[x1][y1])continue;
	  if(!bl[x1][y1])continue;
	  bl[x1][y1]=false;
	  if(dx[x1][y1]==0||find(dx[x1][y1],dy[x1][y1])){
	    dx[x1][y1]=x;dy[x1][y1]=y;return true;
	  }
	}
	return false;
}
int main()
{
	int i,j,a,b;
	scanf("%d%d",&n,&p);
	for(i=0;i<=n+1;i++)map[0][i]=map[i][0]=map[n+1][i]=map[i][n+1]=1;
	for(i=1;i<=p;i++){
	  scanf("%d%d",&a,&b);
	  map[a][b]=1;
	}
	for(i=1;i<=n;i++)
	  for(j=1;j<=n;j++){
	    if(map[i][j])continue;
	    pr q;
	    q.x=i;q.y=j;
	    if((i+j)&1)bk.push_back(q);
	      else wt.push_back(q);
	  }
	if(bk.size()!=wt.size()){printf("No\n");return 0;}
	for(i=0;i<bk.size();i++){
	  memset(bl,true,sizeof(bl));
	  if(!find(bk[i].x,bk[i].y)){printf("No\n");return 0;}
	}
	printf("Yes\n");
	vector<int> c,r;
	for(i=0;i<wt.size();i++){
	  int x=wt[i].x,y=wt[i].y;
	  if(dx[x][y]==x)r.push_back(i);
	  else c.push_back(i);
	}
	printf("%d\n",c.size());
	for(i=0;i<c.size();i++){
	  int num=c[i];
          int x=wt[num].x,y=wt[num].y;
	  printf("%d %d\n",min(x,dx[x][y]),y);
	}
	printf("%d\n",r.size());
	for(i=0;i<r.size();i++){
	  int num=r[i];int x=wt[num].x,y=wt[num].y;
	  printf("%d %d\n",x,min(y,dy[x][y]));
	}
	return 0;
}
个人工具