Description
windy有一块矩形土地,被分为 N*M 块 1*1 的小格子。 有的格子含有障碍物。
如果从格子A可以走到格子B,那么两个格子的距离就为两个格子中心的欧几里德距离。 如果从格子A不可以走到格子B,就没有距离。
如果格子X和格子Y有公共边,并且X和Y均不含有障碍物,就可以从X走到Y。 如果windy可以移走T块障碍物,求所有格子间的最大距离。
保证移走T块障碍物以后,至少有一个格子不含有障碍物。
Input
输入文件maxlength.in第一行包含三个整数,N M T。
接下来有N行,每行一个长度为M的字符串,’0’表示空格子,’1’表示该格子含有障碍物。
Output
输出文件maxlength.out包含一个浮点数,保留6位小数。
Sample Input
【输入样例一】
3 3 0
001
001
110
【输入样例二】
4 3 0
001
001
011
000
【输入样例三】
3 3 1
001
001
001
Sample Output
【输出样例一】
1.414214
【输出样例二】
3.605551
【输出样例三】
2.828427
HINT
20%的数据,满足 1 <= N,M <= 30 ; 0 <= T <= 0 。 40%的数据,满足 1 <= N,M <= 30 ; 0
<= T <= 2 。 100%的数据,满足 1 <= N,M <= 30 ; 0 <= T <= 30 。
题解
数据范围小,搜索乱搞
枚举起始点i,j,以i,j跑宽搜,d[x][y]表示从i,j到x,y需要移走的最少障碍物
宽搜不多说
之后枚举终点,看看是不是满足<=t顺便更新答案
结果我宽搜打错了调了一个中午。。
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
const int dx[4]={0,-1,0,1};
const int dy[4]={-1,0,1,0};
bool mp[31][31];
int n,m,t;
char ss[31];
double get(int u,int v,int p,int q)
{
return sqrt(double((u-p)*(u-p))+double((v-q)*(v-q)));
}
int d[31][31];
bool v[31][31];
struct node
{
int x,y;
};
queue<node> q;
bool chk(int x,int y)
{
if(x<1 || x>n || y<1 || y>m)return false;
return true;
}
void spfa(int stx,int sty)
{
memset(d,63,sizeof(d));
if(mp[stx][sty]==false)d[stx][sty]=1;
else d[stx][sty]=0;
node tmp;
tmp.x=stx;tmp.y=sty;q.push(tmp);
memset(v,false,sizeof(v));v[stx][sty]=true;
while(!q.empty())
{
tmp=q.front();
for(int i=0;i<=3;i++)
{
node cnt;
cnt.x=tmp.x+dx[i];cnt.y=tmp.y+dy[i];
if(chk(cnt.x,cnt.y))
{
if(mp[cnt.x][cnt.y]==false)
{
if(d[cnt.x][cnt.y]>d[tmp.x][tmp.y]+1)
{
d[cnt.x][cnt.y]=d[tmp.x][tmp.y]+1;
if(v[cnt.x][cnt.y]==false)
{
v[cnt.x][cnt.y]=true;
q.push(cnt);
}
}
}
else
{
if(d[cnt.x][cnt.y]>d[tmp.x][tmp.y])
{
d[cnt.x][cnt.y]=d[tmp.x][tmp.y];
if(v[cnt.x][cnt.y]==false)
{
v[cnt.x][cnt.y]=true;
q.push(cnt);
}
}
}
}
}
q.pop();v[tmp.x][tmp.y]=false;
}
}
int main()
{
memset(mp,false,sizeof(mp));
scanf("%d%d%d",&n,&m,&t);
for(int i=1;i<=n;i++)
{
scanf("%s",ss+1);
for(int j=1;j<=m;j++)if(ss[j]=='0')mp[i][j]=true;
}
double ans=0.0;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
spfa(i,j);
for(int x=1;x<=n;x++)
for(int y=1;y<=m;y++)
if(d[x][y]<=t)
{
ans=max(ans,get(i,j,x,y));
}
}
printf("%.6lf\n",ans);
return 0;
}