您的位置:首页 > 其它

zoj 3761

2014-03-02 23:07 246 查看
很简单但很虐心的一道题;

我感觉自己的算法没错,但是老是过不了;= =

但是还是把代码贴出来;

我的方法,用并查集的方式做一课树,然后对树进行遍历;

有多少棵树就有多少个点剩余;

#include<cstdio>
#include<cstring>
#define maxn 2009
#include<algorithm>
#define inf 1e9
using namespace std;
char s[4][10]={"LEFT","DOWN","RIGHT","UP"};
struct node
{
int x,y;
int son[4];
int d[4];
} no[maxn];
bool vis[maxn];
int f[maxn];

int check(int a,int b)
{
return (abs(no[a].x-no[b].x)+abs(no[a].y-no[b].y));
}

int find(int x)
{
return f[x]==x?x:f[x]=find(f[x]);
}

void un(int x,int y)
{
int a=find(x);
int b=find(y);
if(a!=b)
f[a]=b;
return;
}

void dfs(int x,int f)
{
vis[x]=1;
for(int i=0;i<4;i++)
{
int v=no[x].son[i];
if(v!=-1&&!vis[v])
{
dfs(v,x);
}
}
if(f!=-1)
{
for(int i=0;i<4;i++)
{
if(no[f].son[i]==x)
{
printf("(%d, %d) %s\n",no[x].x,no[x].y,s[i]);
}
}
}
}

int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
for(int i=0; i<n; i++)
{
scanf("%d%d",&no[i].x,&no[i].y);
for(int j=0; j<4; j++)
{
no[i].son[j]=-1;
no[i].d[j]=inf;
f[i]=i;
}
}
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
if(i==j)continue;
if(no[i].x==no[j].x)
{
un(i,j);
if(no[j].y<no[i].y)
{
if(check(i,j)<no[i].d[3])
{
no[i].son[3]=j;
no[i].d[3]=check(i,j);
}
}
else
{
if(check(i,j)<no[i].d[1])
{
no[i].son[1]=j;
no[i].d[1]=check(i,j);
}
}
}
else if(no[i].y==no[j].y)
{
un(i,j);
if(no[j].x<no[i].x)
{
if(check(i,j)<no[i].d[2])
{
no[i].son[2]=j;
no[i].d[2]=check(i,j);
}
}
else
{
if(check(i,j)<no[i].d[0])
{
no[i].son[0]=j;
no[i].d[0]=check(i,j);
}
}
}
}
}
int ans=0;
for(int i=0;i<n;i++)
{
if(f[i]==i)
ans++;
}
printf("%d\n",ans);
memset(vis,0,sizeof vis);
for(int i=0;i<n;i++)
{
dfs(i,-1);
}
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: