您的位置:首页 > 其它

最远距离

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,求出任意两点间最短距离,之后枚举点对,在最短距离不超过𝑇的前提下更新最大欧几里得距离。

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