60pts求助
查看原帖
60pts求助
560807
木棉絮123楼主2023/11/1 17:21

wa#1,5,8,9,过了样例

#include<bits/stdc++.h>
using namespace std;
#define fo(a,b,c) for(int a=b;a<=c;a++)
#define mkp make_pair
typedef pair<int,int> pii;
namespace bfs
{
	constexpr int MAX=50;
	int n,m,t;
	int mp[MAX][MAX],dis[MAX][MAX][MAX][MAX],vis[MAX][MAX];//dis->从x到达y的最小权值
	int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
	bool check(int a,int b)
	{
		return a>=1&&a<=n&&b>=1&&b<=m;
	}
	void bfs(int x,int y)
	{
		memset(vis,0,sizeof(vis));
		queue<pii>q;
		dis[x][y][x][y]=mp[x][y];
		q.push(mkp(x,y));
		while(!q.empty())
		{
			int x1=q.front().first,y1=q.front().second;
			q.pop();
			if(vis[x1][y1])
				continue;
			vis[x1][y1]=1;
//			auto check=[](int a,int b){return a>=1&&a<=n&&b>=1&&b<=m;};
			fo(i,0,3)
			{
				int x2=x1+dx[i],y2=y1+dy[i];
				if(!check(x2,y2))
					continue;
//				cout<<x2<<' '<<y2<<endl;
				q.push(mkp(x2,y2));
				dis[x][y][x2][y2]=min(dis[x][y][x2][y2],dis[x][y][x1][y1]+mp[x2][y2]);
			}
		}
//		cout<<"x"<<x<<' '<<"y"<<y<<endl;
	}
	void main()
	{
		cin>>n>>m>>t;
		fo(i,1,n)
		{
			fo(j,1,m)
			{
				char ipt;
				cin>>ipt;
				mp[i][j]=ipt-'0';
			}
		}
		memset(dis,0x3f,sizeof(dis));
		fo(i,1,n)
		{
			fo(j,1,m)
			{
				bfs(i,j);
			}
		}
		double ans=0;
		fo(i,1,n)
		{
			fo(j,1,m)
			{
				fo(k,1,n)
				{
					fo(l,1,m)
					{
//						cout<<"i:"<<i<<"j:"<<j<<"k:"<<k<<"l:"<<l<<"dis:"<<dis[i][j][k][l]<<endl;
						if(dis[i][j][k][l]<=t)
							ans=max(ans,1.0*(i-k)*(i-k)+(j-l)*(j-l));
//						ans;
					}
				}
			}
		}
		printf("%.6f",sqrt(ans));
	}
}
int main()
{
	bfs::main();
	return 0;
}
2023/11/1 17:21
加载中...