1 条题解
-
0
C++ :
#include<iostream> #include<cstring> #include<cstdio> #include<queue> #include<cmath> #include<iomanip> using namespace std; int n,m,t,dis[50][50]; char a[50][50]; int dx[4]={1,0,-1,0}, dy[4]={0,1,0,-1}; double maxdist=0; void init(); void spfa(int,int); double dist(int,int,int,int); void work(); int main() { //freopen("distance.in","r",stdin); //freopen("distance.out","w",stdout); init(); work(); fclose(stdin); fclose(stdout); return 0; } void init() { cin>>n>>m>>t; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++)cin>>a[i][j]; } double dist(int x1,int y1,int x2,int y2) { return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); } void spfa(int x,int y) { queue<int> q1,q2; q1.push(x);q2.push(y); int x1,y1,x2,y2,tot=0; memset(dis,0x7f,sizeof(dis)); dis[x][y]=0; while(!q1.empty()) { x1=q1.front();y1=q2.front(); if(dist(x,y,x1,y1)>maxdist) maxdist=dist(x,y,x1,y1); for(int i=0;i<4;i++) { x2=x1+dx[i];y2=y1+dy[i]; if(x2>0 && x2<=n && y2>0 && y2<=n) { if(a[x2][y2]=='1') tot=dis[x1][y1]+1;//如果x2,y2点事障碍则 //x2,y2到原点的最短距离加1 else tot=dis[x1][y1]; if(tot>t) continue;//这是一个小优化,如果长度大于t就不用更新x2,y2这点了 if(tot<dis[x2][y2]) { dis[x2][y2]=tot; q1.push(x2);q2.push(y2); } } } q1.pop();q2.pop(); } } void work() { for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(a[i][j]=='0')spfa(i,j); cout.setf(ios::fixed); cout<<setprecision(6)<<maxdist<<endl; }
- 1
信息
- ID
- 1457
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者