• FZU 2150 BFS


    #include<iostream>
    #include<memory.h>
    #include<vector>
    #include<queue>
    using namespace std;
    int t,n,m;
    int vis[12][12];
    int dir[4][2]= {-1,0,1,0,0,-1,0,1};
    char mat[12][12];
    struct node
    {
        int x,y,t;
        node(int xx,int yy,int tt)
        {
            x=xx;
            y=yy;
            t=tt;
        }
    };
    int bfs(node a,node b)
    {
        memset(vis,0,sizeof(vis));
        queue<node> q;
        vis[a.x][a.y]=1;
        vis[b.x][b.y]=1;
        q.push(a);
        q.push(b);
        int res=0;
        while(!q.empty())
        {
            a=q.front();
            q.pop();
            res=a.t;
            for(int i=0;i<4;i++)
            {
                int dx=a.x+dir[i][0];
                int dy=a.y+dir[i][1];
                if(dx<0||dy<0||dx>=n||dy>=m||mat[dx][dy]!='#'||vis[dx][dy]) continue;
                vis[dx][dy]=1;
                q.push(node(dx,dy,res+1));
            }
        }
        return res;
    }
    vector<node> v;
    int main()
    {
        cin>>t;
        int num=0;
        while(t--)
        {
            num++;
            v.clear();
            cin>>n>>m;
            for(int i=0; i<n; i++) cin>>mat[i];
            for(int i=0; i<n; i++)
            {
                for(int j=0; j<m; j++)
                {
                    if(mat[i][j]=='#') v.push_back(node(i,j,0));
                }
            }
            if(v.size()==1)
            {
                cout<<"Case "<<num<<": "<<0<<endl;
                continue;
            }
            int ans=0x3f3f3f3f;
            for(int i=0; i<v.size(); i++)
            {
                for(int j=i+1; j<v.size(); j++)
                {
                    int tmp=bfs(v[i],v[j]);
                    int ok=1;
                    for(int i=0; i<n; i++)
                    {
                        for(int j=0; j<m; j++)
                        {
                            if(vis[i][j]==0&&mat[i][j]=='#')
                            {ok=0;break;}
                        }
                        if(!ok)
                        {
                            break;
                        }
                    }
                    if(ok)
                    {
                        ans=min(ans,tmp);
                    }
                }
            }
            if(ans==0x3f3f3f3f) cout<<"Case "<<num<<": "<<-1<<endl;
            else cout<<"Case "<<num<<": "<<ans<<endl;
        }
        return 0;
    }
    View Code

    首先把所有可燃烧的草丛点都压入vector。然后暴力枚举两个点作为初始燃烧起点。

    将这两个点压入队列执行bfs(和最简单的bfs相比只是初始多压入一个起点)。执行结束后判断是否有未燃烧部分,有则此种选法不成立。继续执行后续燃烧方法。

  • 相关阅读:
    【转】CentOS8新特性
    【转】Python 库打包分发(setup.py 编写)简易指南
    【转】Python3的venv虚拟环境操作(Linux)
    【转】Qt绘图之QGraphicsScene QGraphicsView QGraphicsItem详解
    【转】Qt 积累
    webapi 参数传递详解
    WPF 字体图标样式
    asp net core mvc 跨域ajax解决方案
    NPOI导出Excel封装
    XML序列化CDATA
  • 原文地址:https://www.cnblogs.com/wangkaipeng/p/6673931.html
Copyright © 2020-2023  润新知