zoukankan      html  css  js  c++  java
  • FZU 2150

    题目大意:有一个矩阵,"."表示石头,"#",表示小草,有两个人,可以在任意两个位置点燃小草,小草可以上下左右蔓延,蔓延一次的时间为1,问所有蔓延完所有小草所花费的最短时间。如果不可能蔓延完所有的小草,输出-1。

    题解:暴力枚举两个点的位置,然后以这两个点为起点,将这两个点放入队列中,跑bfs。(属于多起点bfs问题)

    code:

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<queue>
    
    using namespace std;
    const int INF=1e9+7;
    const int N = 20;
    char mp[N][N];
    struct stu {
        int x, y, time;
    };
    int n, m;
    int sum=INF;
    int d[4][2]={1,0,0,1,0,-1,-1,0};
    bool mark[N][N];
    queue<stu> que; 
    int bfs(){
        int ans=0;
        while(que.size()){
            stu x1=que.front();
            que.pop();
            ans=max(ans,x1.time); 
            for(int i=0;i<4;i++){
                int dx=x1.x+d[i][0];
                int dy=x1.y+d[i][1];
                if(dx<1||dy<1||dx>n||dy>m||mp[dx][dy]=='.'||mark[dx][dy]) continue ;
                stu c;
                 c.x=dx;c.y=dy;c.time=1+x1.time;que.push(c);
                mark[dx][dy]=1; 
            }
        }
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                if(mp[i][j]=='#'&&mark[i][j]==0) return INF;
             }
        }
        return ans;
    }
    
    void solve(int time){
        sum=INF;
        bool flag=0;
        cin >> n >> m;
        for (int i = 1; i <= n; i++)  scanf("%s", mp[i] + 1);  
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                for (int k = 1; k <= n; k++) {
                    for (int k1 = 1; k1 <= m; k1++) {
                        if(i==k&&j==k1) continue ;
                        if (mp[i][j] == '.' || mp[k][k1] == '.')continue;
                        else {
                            flag=1;
                            memset(mark, 0, sizeof mark);
                            stu c;
                            c.x=i;c.y=j;c.time=0;que.push(c);
                            c.x=k;c.y=k1;c.time=0;que.push(c);
                            mark[i][j]=1;mark[k][k1]=1; 
                            sum=min(bfs(),sum);
                        }
                    }
                }
            } 
        }
        if(!flag) sum=0;
        printf("Case %d: %d
    ",time,sum==INF? -1:sum);
    }
    int main(){
        int t; cin >> t;
        for(int i=1;i<=t;i++) solve(i);
        return 0;
    }
  • 相关阅读:
    Python爬虫的开发
    JSON
    XPath
    w3c
    Python I/O操作
    【转】C语言中DEFINE简介及多行宏定义
    【转】C++中#if #ifdef 的作用
    srand()、rand()、time()函数的用法
    排序算法之冒泡排序、选择排序
    Java Spring学习笔记
  • 原文地址:https://www.cnblogs.com/Accepting/p/12576306.html
Copyright © 2011-2022 走看看