分析
因为 都很小,所以暴力搜索就可以过。加个小减枝就可以了。那么我们枚举一个点作为起点,然后求到其它点最少通过多少个障碍就可以了。因为用了搜索,这里不分析时间复杂度。
代码
#include<bits/stdc++.h>
using namespace std;
const int N = 31;
int dis[N][N],n,m,k,ans,dx[4] = {0,0,-1,1},dy[4] = {1,-1,0,0};
char ch[N][N];
void dfs(int x,int y,int op) {
if(x < 1 || y < 1 || x > n || y > m) return;
if(dis[x][y] <= op) return ;dis[x][y] = op;
for(int i = 0;i < 4;i++) dfs(dx[i]+x,dy[i]+y,op+(ch[dx[i]+x][dy[i]+y] == '1'));
}
int main() {
scanf("%d%d%d",&n,&m,&k);
for(int i = 1;i <= n;i++) {
scanf("%s",ch[i] + 1);
}
for(int i = 1;i <= n;i++) {
for(int j = 1;j <= m;j++) {
memset(dis,0x3f,sizeof(dis));
if(ch[i][j] == '1') continue;
dfs(i,j,0);dis[i][j] = 0;
for(int x = 1;x <= n;x++) {
for(int y = 1;y <= m;y++) {
if(dis[x][y] > k) continue;
ans = max((i-x)*(i-x)+(j-y)*(j-y),ans);
}
}
}
}
printf("%.6f\n",(double)sqrt(ans));
return 0;
}
京公网安备 11010502036488号