[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;
}
全部评论

相关推荐

4 收藏 评论
分享
牛客网
牛客企业服务