• FZU 2150 Fire Game 广度优先搜索,暴力 难度:0


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

    注意这道题可以任选两个点作为起点,但是时间仍足以穷举两个点的所有可能

    #include <cstdio>
    #include <cstring>
    #include <queue>
    using namespace std;
    const int maxn=11;
    const int inf=0x3fffffff;
    char maz[maxn][maxn];
    int dp[maxn][maxn];
    int n,m,mxn,num;
    
    queue<int> que;
    const int dx[8]={0,0,1,-1,1,1,-1,-1};
    const int dy[8]={1,-1,0,0,1,-1,1,-1};
    struct pnt {
            int x,y;
            pnt(){x=y=0;}
            pnt(int tx,int ty){x=tx,y=ty;}
    };
    bool in(int x,int y){
            return x>=0&&x<n&&y>=0&&y<m;
    }
    void bfs(pnt s,pnt s2){
            while(!que.empty())que.pop();
            int tnum=0;
            int tmxn=0;
            dp[s.x][s.y]=0;
            tnum++;
            que.push(s.x*maxn+s.y);
            if(s2.x!=s.x||s2.y!=s.y){
                    dp[s2.x][s2.y]=0;
                    tnum++;
                    que.push(s2.x*maxn+s2.y);
            }
            while(!que.empty()){
                    int x=que.front()/maxn,y=que.front()%maxn;que.pop();
                    tmxn=max(tmxn,dp[x][y]);
                    for(int i=0;i<4;i++){
                            int tx=x+dx[i],ty=y+dy[i];
                            if(in(tx,ty)&&maz[tx][ty]=='#'&&dp[tx][ty]>dp[x][y]+1){
                                    dp[tx][ty]=dp[x][y]+1;
                                    tnum++;
                                    que.push(tx*maxn+ty);
                            }
                    }
            }
            if(tnum==num)mxn=min(mxn,tmxn);
    }
    void init(){
            for(int i=0;i<n;i++){
                    for(int j=0;j<m;j++){
                            dp[i][j]=inf;
                    }
            }
    
    }
    pnt heap[maxn*maxn];int hlen;
    int main(){
            int T;
            scanf("%d",&T);
            for(int ti=1;scanf("%d%d",&n,&m)==2&&ti<=T;ti++){
                    for(int i=0;i<n;i++){
                            scanf("%s",maz[i]);
                    }
                    num=0;mxn=inf;hlen=0;
                    for(int i=0;i<n;i++){
                            for(int j=0;j<m;j++){
                                    if(maz[i][j]=='#'){
                                            num++;
                                            heap[hlen++]=pnt(i,j);
                                    }
                            }
                    }
                    for(int i=0;i<hlen;i++){
                            for(int j=i;j<hlen;j++){
                                    init();
                                    bfs(heap[i],heap[j]);
                            }
                    }
    
                    printf("Case %d: %d
    ",ti,mxn==inf?-1:mxn);
            }
            return 0;
    }
    

      

  • 相关阅读:
    智能指针的简单实现
    原型模式
    Linux——模拟实现一个简单的shell(带重定向)
    软件开发的一个案例:学生信息管理系统
    关于正则的一点总结
    STL——模拟实现空间配置器
    LeetCode全文解锁 √
    话说extern和static
    C++有关 const & 内敛 & 友元&静态成员那些事
    C语——宏小结
  • 原文地址:https://www.cnblogs.com/xuesu/p/4338168.html
Copyright © 2020-2023  润新知