fzu2150

#include<iostream>  
#include<cstring>  
#include<algorithm>  
#include<string>  
#include<cstdio>  
#include<queue>  
using  namespace std;  
#define inf 0x3f3f3f  

struct Point   
{  
    int x;  
    int y;  
};  

int n, m;  
char map[15][15];  
int dis[15][15];  
queue<Point>que;  
int dirx[4] = { 1, -1, 0, 0 };  
int diry[4] = { 0, 0, -1, 1 };  

int bfs(int x1, int y1, int x2, int y2)  
{  
    int xx, yy;  
    Point p1, p2, cur, nex;  
    memset(dis, inf, sizeof(dis));  
    p1.x = x1; p1.y = y1;  
    p2.x = x2; p2.y = y2;  
    dis[x1][y1] = 0;  
    dis[x2][y2] = 0;  
    que.push(p1);  
    que.push(p2);  
    while (!que.empty())  
    {  
        cur = que.front();  
        que.pop();  
        for (int i = 0; i<4; i++)  
        {  
            xx = cur.x + dirx[i];  
            yy = cur.y + diry[i];  
            if (xx >= 0 && xx<n&&yy>=0 && yy<m&&map[xx][yy] == '#'&&dis[xx][yy]>dis[cur.x][cur.y] + 1)  
            {  
                dis[xx][yy] = dis[cur.x][cur.y] + 1;  
                nex.x = xx;  
                nex.y = yy;  
                que.push(nex);  
            }  
        }  
    }  
    int maxx = 0;  
    for (int i = 0; i < n;i++)  
    for (int j = 0 ; j < m; j++)  
    if (map[i][j] == '#')  
    {  
        maxx = max(maxx, dis[i][j]);  
    }  
    return maxx;  
}  

int main()  
{  
    int casen;  
    cin >> casen;  
    for (int cas = 1; cas <= casen; cas++)  
    {  
        while (!que.empty())  
            que.pop();  
        cin >> n >> m;  

        for (int i = 0; i < n; i++)  
            cin >> map[i];  

        int temp;  
        int ans = inf;  
        for (int i = 0; i < n;i++)  
        for (int j = 0; j < m;j++)  
        if (map[i][j] == '#')  
        for (int ii = 0; ii < n;ii++)  
        for (int jj = 0; jj < m;jj++)  
        if (map[ii][jj] == '#')  
        {  
            temp = bfs(i, j, ii, jj);  
            ans = min(ans, temp);  
        }  
        if (ans == inf) ans = -1;   
                cout << "Case " << cas << ": " << ans << endl;  
    }  
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值