FZU2150——BFS——Fire Game

简单BFS

http://acm.fzu.edu.cn/problem.php?pid=2150

/************************************************
* Author        :Powatr
* Created Time  :2015-8-23 12:33:32
* File Name     :J.cpp
 ************************************************/

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <bitset>
#include <cstdlib>
#include <ctime>
using namespace std;

#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
typedef long long ll;
const int MAXN = 1e5 + 10;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;

int dirx[] = {1, -1, 0, 0};
int diry[] = {0, 0, 1, -1};
struct edge1{
    int x, y, t;
};
queue<edge1> q;
struct edge{
    int x, y;
} a[200];
int vis[11][11];
char mp[11][11];
int n, m;
int ok(int x, int y){
    if(x>= 1 && x <= n && y >= 1 && y <= m && !vis[x][y] && mp[x][y] == '#')
        return true;
    return false;
}
int main(){
    int T;
    scanf("%d", &T);
    for(int cas = 1; cas <= T;cas++){
        memset(mp, 0, sizeof(mp));
        memset(a, 0, sizeof(a));
        scanf("%d%d", &n, &m);
        for(int i = 1; i <= n; i++){
                scanf("%s", mp[i] + 1);
            }
        
        int cout = 0;
        for(int i = 1; i <= n; i++){
            for(int j = 1; j <= m; j++){
                if(mp[i][j] == '#'){ 
                    a[++cout].x = i;
                    a[cout].y = j;
                }
            }
        }
        int Time = INF;
        if(cout <= 2) {
            printf("Case %d: 0\n", cas);
            continue;
        }
        for(int i = 1; i <=cout ;i++){
            for(int j = i + 1; j <= cout; j++){
                int time = 0;
                memset(vis, 0, sizeof(vis));
                vis[a[i].x][a[i].y] = vis[a[j].x][a[j].y] = 1;
                while(!q.empty()) q.pop();
                q.push((edge1){a[i].x, a[i].y, 0});
                q.push((edge1){a[j].x, a[j].y, 0});
                while(!q.empty()){
                    edge1 now = q.front(); q.pop();
                    int dx = now.x;
                    int dy = now.y;
                    int tt = now.t;
                    time = max(time, tt);
                    int sx, sy;
                    for(int i = 0 ; i < 4; i++){
                        sx = dx + dirx[i];
                        sy = dy + diry[i];
                        if(ok(sx,sy)){
                            vis[sx][sy] = 1;
                            q.push((edge1){sx, sy, tt+1});
                            }
                        }
                    }
                int flag = 0;
                for(int i = 1; i <= n; i++){
                    for(int j = 1; j <= m; j++){
                        if(mp[i][j] == '#' && vis[i][j] == 0){
                            flag = 1;
                            break;
                        }
                    }
                }
                if(!flag) 
                Time = min(Time, time);
                }
            }
        int flag = 0;
        printf("Case %d: ", cas);
        if(Time == INF) puts("-1");
        else 
        printf("%d\n", Time );
    }
    return 0;
}
        

  

posted @ 2015-08-23 19:08  Painting、时光  阅读(115)  评论(0编辑  收藏  举报