zoukankan      html  css  js  c++  java
  • fzu2150(bfs)

    题目链接:http://acm.fzu.edu.cn/problem.php?pid=2150

    题意:在任意两处点火,求最短时间烧光所有草堆。

    分析:由于n,m比较小,将所有草堆坐标记录下来,然后暴力枚举所有可能的两处草堆为起点燃烧。最后取最短时间。求每两处燃烧需要用的时间一次bfs即可。

    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <iostream>
    #include <algorithm>
    #include <queue>
    #include <cstdlib>
    #include <vector>
    #include <set>
    #include <map>
    #define LL long long
    #define mod 1000000007
    #define inf 0x3f3f3f3f
    #define N 100010
    using namespace std;
    struct node
    {
        int x,y,step;
    };
    int vis[15][15],n,m;
    char s[15][15];
    int px[110],py[110],tot;
    int dx[]={0,0,1,-1};
    int dy[]={1,-1,0,0};
    queue<node>que;
    node make_node(int a,int b,int c)
    {
        node temp;
        temp.x=a;temp.y=b;temp.step=c;
        return temp;
    }
    bool judge(int x,int y)
    {
        return x>=1&&x<=n&&y>=1&&y<=m&&s[x][y]=='#'&&!vis[x][y];
    }
    int bfs(int i,int j)
    {
        memset(vis,0,sizeof(vis));
        while(!que.empty())que.pop();
        que.push(make_node(px[i],py[i],0));
        que.push(make_node(px[j],py[j],0));
        vis[px[i]][py[i]]=1;vis[px[j]][py[j]]=1;
        int sum=0,mx=0;
        while(!que.empty())
        {
            node cur,nxt;
            cur=que.front();que.pop();
            int step=cur.step;
            mx=max(step,mx);
            sum++;
            for(int ii=0;ii<4;ii++)
            {
                int x=dx[ii]+cur.x,y=dy[ii]+cur.y;
                if(judge(x,y))
                {
                    vis[x][y]=1;
                    que.push(make_node(x,y,step+1));
                }
            }
        }
        if(sum==tot)return mx;
        else return inf;
    }
    int main()
    {
        int T,cas=1;
        scanf("%d",&T);
        while(T--)
        {
            scanf("%d%d",&n,&m);
            for(int i=1;i<=n;i++)scanf("%s",s[i]+1);
            tot=0;
            for(int i=1;i<=n;i++)
            {
                for(int j=1;j<=m;j++)
                    if(s[i][j]=='#')
                    {
                        px[++tot]=i;py[tot]=j;
                    }
            }
            printf("Case %d: ",cas++);
            if(tot<=2)
            {
                puts("0");continue;
            }
            int ans=inf;
            for(int i=1;i<=tot;i++)
            for(int j=i+1;j<=tot;j++)
            {
                ans=min(ans,bfs(i,j));
            }
            if(ans==inf)puts("-1");
            else printf("%d
    ",ans);
        }
    }
    View Code
  • 相关阅读:
    Android之BroadcastReceiver1
    contentprovider提供程序间共享数据的统一接口
    Android之访问下载文件
    Android之SQLite
    Android之Handler
    sql server异地备份数据库
    Android常用控件
    Android学习笔记02
    Android学习笔记01
    java多线程的使用2
  • 原文地址:https://www.cnblogs.com/lienus/p/4167471.html
Copyright © 2011-2022 走看看