最远距离
2015-10-11 18:34
232 查看
【Description】
whitecloth 有一块矩形土地,被分为N*M 块1*1 的小格子。
有的格子含有障碍物。
如果从格子A 可以走到格子B,那么两个格子的距离就为两个格子中
心的欧几里德距离。
如果从格子A 不可以走到格子B,就没有距离。
如果格子X 和格子Y 有公共边,并且X 和Y 均不含有障碍物,就可
以从X 走到Y。
如果whitecloth 可以移走T 块障碍物,求所有格子间的最大距离。
保证移走T 块障碍物以后,至少有一个格子不含有障碍物。
【Input】
第一行包含三个整数,N M T。
接下来有N 行,每行一个长度为M 的字符串,'0'表示空格子,'1'表
示该格子含有障碍物。
【Output】
一个数表示答案,保留6 位小数
【Sample Input】
3 3 0
001
001
110
【Sample Output】
1.414214
【Hint】
对于20%的数据,满足1 <= N,M <= 30 ,0 <= T <= 0
对于40%的数据,满足1 <= N,M <= 30 ,0 <= T <= 2
把障碍物的权值看做1,求出任意两点间最短距离,之后枚举点对,在最短距离不超过𝑇的前提下更新最大欧几里得距离。
View Code
whitecloth 有一块矩形土地,被分为N*M 块1*1 的小格子。
有的格子含有障碍物。
如果从格子A 可以走到格子B,那么两个格子的距离就为两个格子中
心的欧几里德距离。
如果从格子A 不可以走到格子B,就没有距离。
如果格子X 和格子Y 有公共边,并且X 和Y 均不含有障碍物,就可
以从X 走到Y。
如果whitecloth 可以移走T 块障碍物,求所有格子间的最大距离。
保证移走T 块障碍物以后,至少有一个格子不含有障碍物。
【Input】
第一行包含三个整数,N M T。
接下来有N 行,每行一个长度为M 的字符串,'0'表示空格子,'1'表
示该格子含有障碍物。
【Output】
一个数表示答案,保留6 位小数
【Sample Input】
3 3 0
001
001
110
【Sample Output】
1.414214
【Hint】
对于20%的数据,满足1 <= N,M <= 30 ,0 <= T <= 0
对于40%的数据,满足1 <= N,M <= 30 ,0 <= T <= 2
把障碍物的权值看做1,求出任意两点间最短距离,之后枚举点对,在最短距离不超过𝑇的前提下更新最大欧几里得距离。
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<cmath> using namespace std; int n,m,T; char key; int map[35*35]; int dx[35*35][35*35],head[35*35],cnt; int X[35*35]; int Y[35*35]; double ans; struct Node{ int en,to,val; }eda[55000]; bool vis[35*35]; void Add(int x,int y,int z){ eda[++cnt].en=y; eda[cnt].to=head[x]; head[x]=cnt; eda[cnt].val=z; } struct At{ int id,dis; bool friend operator < (At a,At b){ return a.dis>b.dis; } }; void SPFA(int x){ dx[x][x]=map[x]; vis[x]=1; priority_queue<At>st; At ls; ls.id=x; ls.dis=0; st.push(ls); while(!st.empty()){ int u=st.top().id; st.pop(); vis[u]=0; for(int i=head[u];i;i=eda[i].to){ int y=eda[i].en; if(dx[x][y]>dx[x][u]+eda[i].val){ // if(x==5&&y==7) printf("%d %d %d\n",u,dx[x][u],eda[i].val); dx[x][y]=dx[x][u]+eda[i].val; if(!vis[y]){ vis[y]=0; ls.id=y; ls.dis=dx[x][y]; st.push(ls); } } } } } int main(){ memset(dx,30,sizeof(dx)); scanf("%d%d%d",&n,&m,&T); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cin>>key; if(key=='1') map[(i-1)*m+j]=1; X[(i-1)*m+j]=i; Y[(i-1)*m+j]=j; } } for(int i=1;i<=n*m;i++){ if(i%m!=1){ Add(i,i-1,map[i-1]); } if(i%m!=0){ Add(i,i+1,map[i+1]); } if(i>m){ Add(i,i-m,map[i-m]); } if(i<(n-1)*m){ Add(i,i+m,map[i+m]); } } for(int i=1;i<=n*m;i++){ SPFA(i); } for(int i=1;i<=n*m;i++){ for(int j=i+1;j<=n*m;j++){ if(dx[i][j]<=T){//printf("dx[%d][%d]= %d\n",i,j,dx[i][j]); if(ans<sqrt((X[i]-X[j])*(X[i]-X[j])+(Y[i]-Y[j])*(Y[i]-Y[j]))) ans=sqrt((X[i]-X[j])*(X[i]-X[j])+(Y[i]-Y[j])*(Y[i]-Y[j])); } } } printf("%.6lf",ans); }
View Code