您的位置:首页 > 编程语言 > Go语言

TYVJ 2009 Lagoon

2016-07-23 10:19 281 查看
LYD大神出的题(%%%)

貌似可以暴搜??但是有一个很机智的作法—-并查集(真的没想到,感谢YSQ童鞋)

我们可以把图看成若干个联通块,相连的就并在一起……….

很久之前就写了草稿,居然一直忘记放代码,(⊙o⊙)…对自己已经无语到没救了>_<

代码如下:

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#define lala(x,y,z) (x*100+y)*4+z
using namespace std;
const int maxn=50000+5,maxm=100+5;
int n,m,fa[maxn],mp[maxm][maxm],G[maxm*2][maxm*2];
double size[maxn];
char str[100+5];
inline int read(){
char ch=getchar();
int f=1,x=0;
while(!(ch>='0'&&ch<='9')){
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
x=x*10+ch-'0',ch=getchar();
return f*x;
}
int find(int x){
return fa[x]==x ? x : fa[x]=find(fa[x]);
}
void combine(int x1,int y1,int k1,int x2,int y2,int k2){
if(x1<=0||y1<=0||x2<=0||y2<=0||x1>n||x2>n||y1>m||y2>m)
return;
int fx=find(lala(x1,y1,k1)),fy=find(lala(x2,y2,k2));
if(fx==fy)
return;
fa[fy]=fx;
size[fx]+=size[fy];
}
signed main(void){
n=read(),m=read();
for(int i=1;i<=n;i++){
cin>>str;
for(int j=1;j<=m;j++)
mp[i][j]=str[j-1]-'0';
}
for(int i=0;i<=50000;i++)
fa[i]=i;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
if(mp[i][j]==0){
size[lala(i,j,1)]=size[lala(i,j,4)]=0.785398163397;
size[lala(i,j,2)]=size[lala(i,j,3)]=1.214601836602552;
combine(i,j,2,i,j,3);
}
else if(mp[i][j]==1){
size[lala(i,j,1)]=size[lala(i,j,4)]=1.214601836602552;
size[lala(i,j,2)]=size[lala(i,j,3)]=0.785398163397;
combine(i,j,1,i,j,4);
}
combine(i,j,1,i-1,j,3);
combine(i,j,1,i,j-1,2);
combine(i,j,2,i-1,j,4);
combine(i,j,3,i,j-1,4);
G[(i-1)*2][(j-1)*2]=lala(i,j,1);
G[i*2][j*2]=lala(i,j,4);
G[i*2][(j-1)*2]=lala(i,j,3);
G[(i-1)*2][j*2]=lala(i,j,2);
G[i*2-1][j*2-1]=lala(i,j,mp[i][j]+3);
}
int q=read();
while(q--){
int x=read(),y=read();
if((x+y)&1)
printf("0.0000\n");
else
printf("%.4f\n",size[find(G[x][y])]);
}
return 0;
}


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