1 条题解

  • 2
    @ 2025-9-1 16:38:53

    這道題我們發現這個 kk 的限制實際上就是每個點周圍可以走 kk

    並且在 00 的位置是可以不用花錢就可以走的

    那我們就可以考慮0-1bfs進行統計其他所有點對於每一個點的距離,然後只要步數小於 kk 即可

    #include<iostream>
    #include<iomanip>
    #include<cstring>
    #include<cstdio>
    #include<queue>
    #include<cmath>
    #define N 35
    using namespace std;
    bool Test_MLE_start;
    int _=1,n,m,k,dx[5]={0,1,0,-1},dy[5]={1,0,-1,0},a[N][N],dis[N][N][N][N];bool vis[N][N];
    struct node{int x,y;};
    deque<node> q;
    inline int reads(){
    	char c=getchar();
    	int sum=0,f=1;
    	while(!isdigit(c)){
    		if(c=='-') f=-1;
    		c=getchar();
    	}
    	while(isdigit(c)){
    		sum=(sum<<3)+(sum<<1)+(c^'0');
    		c=getchar();
    	}
    	return sum*f;
    }
    inline void files(){
    	freopen("A.in","r",stdin);
    //	freopen("std.out","w",stdout);
    }
    inline void clr(){
    //	Don't forget!
    
    }
    void bfs01(int sx,int sy){
    	memset(vis,0,sizeof(vis));
    	q.push_back(node{sx,sy});dis[sx][sy][sx][sy]=a[sx][sy];
    	while(!q.empty()){
    		int idx=q.front().x,idy=q.front().y;q.pop_front();
    		if(vis[idx][idy]) continue;vis[idx][idy]=1;
    		for(int i=0;i<4;i++){
    			int x=idx+dx[i],y=idy+dy[i];
    			if(x<1||x>n||y<1||y>m) continue;
    			if(dis[sx][sy][x][y]>dis[sx][sy][idx][idy]+a[x][y]){
    				dis[sx][sy][x][y]=dis[sx][sy][idx][idy]+a[x][y];
    				if(!a[x][y]) q.push_front(node{x,y});
    				else q.push_back(node{x,y});
    			}
    		}
    	}
    }
    bool Test_MLE_end;
    signed main(){
    //	printf("%lf Mb\n",(&Test_MLE_end-&Test_MLE_start-1)/1024.0/1024.0);
    //	files();
    //	_=reads();
    	while(_--){
    		clr();n=reads(),m=reads(),k=reads();memset(dis,0x3f,sizeof(dis));
    		for(int i=1;i<=n;i++){
    			for(int j=1;j<=m;j++){
    				char c;cin>>c;
    				a[i][j]=c-'0';
    			}
    		}
    		for(int i=1;i<=n;i++){
    			for(int j=1;j<=m;j++){
    				bfs01(i,j);
    			}
    		}double ans=0;
    		for(int i=1;i<=n;i++){
    			for(int j=1;j<=m;j++){
    				for(int x=1;x<=n;x++){
    					for(int y=1;y<=m;y++){
    //						cout<<i<<","<<j<<"->"<<x<<","<<y<<":"<<dis[i][j][x][y]<<"\n";
    						if(dis[i][j][x][y]>k) continue;
    						ans=max(ans,sqrt((i-x)*(i-x)+(j-y)*(j-y)));
    //						if(i==1&&j==5&&x==2&&y==5) cout<<ans<<"\n";
    //						if((i-x)*(i-x)+(j-y)*(j-y)==20) cout<<"!"<<i<<" "<<j<<" "<<x<<" "<<y<<" "<<ans<<"\n";
    					}
    				}
    			}
    		}cout<<fixed<<setprecision(6)<<ans<<"\n";
    	}
    	return 0;
    }
    
    
    • 1

    信息

    ID
    368
    时间
    1000ms
    内存
    256MiB
    难度
    5
    标签
    (无)
    递交数
    30
    已通过
    14
    上传者