[SCOI2009]最长距离
[SCOI2009]最长距离
https://ac.nowcoder.com/acm/problem/20270
分析
因为 都很小,所以暴力搜索就可以过。加个小减枝就可以了。那么我们枚举一个点作为起点,然后求到其它点最少通过多少个障碍就可以了。因为用了搜索,这里不分析时间复杂度。
代码
#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; }