100%的数据,满足1<=N,M<=30,0<=T<=30---来自洛谷的数据范围.
简单来说就是暴力,暴力枚举一个点,然后再算到其他点的之间最少需要移除多少障碍物.然后就结束了.
#include <bits/stdc++.h>
using namespace std;
const int N=32;
char s[N][N];
int n,m,t,w[N][N],dis[N][N];
int dx[4]={0,0,-1,1};int dy[4]={-1,1,0,0};
void dfs(int x,int y,int cnt)
{
//cout<<x<<' '<<y<<endl;
if(cnt>=dis[x][y]) return;
if(cnt>t) return;
dis[x][y]=cnt;
for(int i=0;i<4;i++)
{
int tx=x+dx[i],ty=y+dy[i];
if(tx>=1&&tx<=n&&ty>=1&&ty<=m) dfs(tx,ty,cnt+w[tx][ty]);
}
}
int main()
{
int ans=0;
scanf("%d%d%d",&n,&m,&t);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>s[i][j];
w[i][j]=s[i][j]-'0';
}
}
for(int h1=1;h1<=n;h1++)
{
for(int l1=1;l1<=m;l1++)
{
memset(dis,0x3f,sizeof dis);
int sum;
w[h1][l1]==1?sum=1:sum=0;
dfs(h1,l1,sum);
for(int h2=1;h2<=n;h2++)
{
for(int l2=1;l2<=m;l2++)
{
if(dis[h2][l2]<=t)
{
ans=max(ans,(h2-h1)*(h2-h1)+(l2-l1)*(l2-l1));
}
}
}
}
}
printf("%.6lf\n",sqrt(ans));
return 0;
}
京公网安备 11010502036488号