记录编号 560166 评测结果 AAAAAAAAAA
题目名称 [HAOI 2021PJ]水儿的绘画 最终得分 100
用户昵称 Gravataryrtiop 是否通过 通过
代码语言 C++ 运行时间 0.000 s
提交时间 2021-04-14 18:55:41 内存使用 0.00 MiB
显示代码纯文本
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int maxn = 55;
const int INF = 0x3f3f3f3f;
int c[maxn][maxn];
char s[maxn][maxn];
int n,m,f = 0;
bool judge(int x,int y) {
    return x >= 1&&x <= n&&y >= 1&&y <= m&&s[x][y] == 'X';
}
void dfs(int x,int y,int C) {
    c[x][y] = C;
    if(judge(x + 1 , y)&&!c[x + 1][y])dfs(x + 1 , y , C);
    if(judge(x , y + 1)&&!c[x][y + 1])dfs(x , y + 1 , C);
    if(judge(x - 1 , y)&&!c[x - 1][y])dfs(x - 1 , y , C);
    if(judge(x , y - 1)&&!c[x][y - 1])dfs(x , y - 1 , C);
    return ;
}
int ABS(int x) {
    return x > 0 ? x : -x;
}
int main() {
    freopen("haoi2021pj_paint.in","r",stdin);
    freopen("haoi2021pj_paint.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i = 1;i <= n;++ i) {
        scanf("%s",s[i] + 1);
    }
    for(int i = 1;i <= n;++ i) {
        if(f >= 2)break ;
        for(int j = 1;j <= m;++ j) {
            if(f >= 2)break ;
            if(s[i][j] == 'X'&&!c[i][j]) {
                dfs(i , j , ++ f);
            }
        }
        if(f >= 2)break ;
    }
//    for(int i = 1;i <= n;++ i) {
//        for(int j = 1;j <= m;++ j) {
//            printf("%d",c[i][j]);
//        }
//        putchar('\n');
//    }
    int ans = n * m;
    for(int i = 1;i <= n;++ i) {
        for(int j = 1;j <= m;++ j) {
            if(c[i][j] == 1) {
                for(int q = 1;q <= n;++ q) {
                    for(int k = 1;k <= m;++ k) {
                        if(c[q][k] == 2) {
                            ans = min(ans , ABS(q - i) + ABS(k - j) - 1);
                        }
                    }
                }
            }
        }
    }
    printf("%d",ans);
    fclose(stdin);
    fclose(stdout);
    return 0;
}