标签:des style class code java http
直接对每个格子进行dfs结果除以2可以得到答案但是有大量重复的结果,不好输出答案.
可以只对横纵坐标相加是奇数的格子dfs....

4 4 6 1 1 1 4 2 2 4 1 4 2 4 4 4 3 4 4 2 3 2 2 2 3 1 0 0
4 (1,2)--(1,3) (2,1)--(3,1) (2,3)--(3,3) (2,4)--(3,4) 3 (1,1)--(2,1) (1,2)--(1,3) (2,3)--(3,3)
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <set>
#include <vector>
using namespace std;
const int dir_x[4]={-1,1,0,0};
const int dir_y[4]={0,0,-1,1};
int mp[120][120];
int n,m,k;
bool used[120][120];
int linker[120][120];
bool dfs(int x,int y)
{
for(int i=0;i<4;i++)
{
int X=x+dir_x[i];
int Y=y+dir_y[i];
if(mp[X][Y]==1) continue;
if(X>n||X<1||Y>m||Y<1) continue;
if(used[X][Y]) continue;
used[X][Y]=true;
if(linker[X][Y]==-1||dfs(linker[X][Y]/1000,linker[X][Y]%1000))
{
linker[X][Y]=x*1000+y;
return true;
}
}
return false;
}
int hungary()
{
int ret=0;
memset(linker,-1,sizeof(linker));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if((i+j)&1||mp[i][j]==1) continue;
memset(used,false,sizeof(used));
if(dfs(i,j)) ret++;
}
}
return ret;
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF&&n&&m)
{
scanf("%d",&k);
memset(mp,0,sizeof(mp));
for(int i=0;i<k;i++)
{
int a,b;
scanf("%d%d",&a,&b);
mp[a][b]=1;
}
printf("%d\n",hungary());
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
int ii=linker[i][j]/1000; int jj=linker[i][j]%1000;
if(jj!=-1)
printf("(%d,%d)--(%d,%d)\n",i,j,ii,jj);
}
}
}
return 0;
}
HDOJ 1507 Uncle Tom's Inherited Land*,布布扣,bubuko.com
HDOJ 1507 Uncle Tom's Inherited Land*
标签:des style class code java http
原文地址:http://blog.csdn.net/ck_boss/article/details/34570315