点我看题目

题意 :就是有两个熊孩子要把一个正方形上的草都给烧掉,他俩同时放火烧,烧第一块的时候是不花时间的,每一块着火的都可以在下一秒烧向上下左右四块#代表草地,.代表着不能烧的。问你最少花多少时间可以烧掉,如果烧不掉就输出-1

思路 :这个题因为可以同时向上下左右同时烧过去,所以一看我就知道是BFS,但是知道没用啊,我做不出来啊,我一开始没想过来,以为两个人烧很麻烦,其实就是向普通的那样做,不过来个6重for循环就行了,其实就是看看有几个块,如果块的个数超过两个就为-1,两个的话,分别开始烧,哪个块里有最长路,就是烧的那个时间,不过你要枚举有最长路的那个的块的每一个可烧的点,从而找出时间最短的,1个块的时候也是一样的,求出最长路,枚举每个点的时候求最短时间。这个题看着芳姐的代码才理解。。。。。

不过做的时候没有去判断几个块,因为你BFS找的时候就处理了。

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <queue>

const int INF = 99999999 ;
int n,m ;
char ch[15][15] ;
int cnt ;
int vis[110][110] ;
int dir[4][2] = {{0,1},{0,-1},{1,0},{-1,0}} ;
struct node
{
    int x,y ;
    int step ;
}q1,q2 ,mapp[150];

using namespace std ;

int BFS(int x1,int y1,int x2,int y2)
{
    int maxx = 0 ;
    queue<node>que ;
    q1.x = x1,q1.y = y1,q1.step = 0 ;
    q2.x = x2,q2.y = y2,q2.step = 0 ;
    que.push(q1) ;
    que.push(q2) ;
    //memset(vis,0,sizeof(vis)) ;
    while(!que.empty())
    {
        struct node st1, st = que.front() ;
        que.pop() ;
        for(int i = 0 ; i < 4 ; i++)
        {
            int xx = st.x+dir[i][0] ;
            int yy = st.y+dir[i][1] ;
            if(!vis[xx][yy] && ch[xx][yy] == '#' && (xx >= 0&&xx < n&&yy>=0&&yy<m))
            {
                vis[xx][yy] = 1 ;
                st1.x = xx ,st1.y = yy ,st1.step = st.step+1 ;
                que.push(st1) ;
            }
        }
        maxx = max(maxx,st.step) ;
    }
    return maxx ;
}

int main()
{
    int T ;
    scanf("%d",&T) ;
    for(int i = 1 ; i <= T ;i++)
    {
        scanf("%d %d",&n,&m) ;
        cnt = 0 ;
        for(int j = 0 ; j < n ; j++)
        {
            scanf("%s",ch[j]) ;
            for(int k = 0 ; k < m ; k++)
            if(ch[j][k] == '#')
            {
                cnt++ ;
                mapp[cnt].x = j ;
                mapp[cnt].y = k ;
            }
        }
        printf("Case %d: ",i) ;
        if(cnt <= 2 )
        {
            printf("0\n") ;
            continue ;
        }
        int minn = INF ;
        for(int j = 0 ; j < cnt ; j++)
        {
            for(int k = j ; k < cnt ; k++)
            {
                memset(vis,0,sizeof(vis)) ;
                vis[mapp[j].x][mapp[j].y] = 1 ;
                vis[mapp[k].x][mapp[k].y] = 1 ;
                bool flag = false ;
                int minnn = BFS(mapp[j].x,mapp[j].y,mapp[k].x,mapp[k].y) ;
                for(int h = 0 ; h < n ; h++)
                {
                    for(int l = 0 ; l < m ; l++)
                    {
                        if(ch[h][l] != '#') continue ;
                        if(!vis[h][l]){flag = true ; break ;}
                    }
                    if(flag) break ;
                }
                if(!flag) minn = min(minn,minnn) ;
            }
        }

        if(minn == INF) printf("-1\n") ;
        else printf("%d\n",minn) ;
    }
    return 0 ;
}
View Code

相关文章:

  • 2022-02-01
  • 2021-08-28
  • 2021-08-24
  • 2021-10-22
  • 2021-06-06
  • 2022-12-23
  • 2021-08-16
猜你喜欢
  • 2021-09-20
  • 2021-05-25
  • 2022-12-23
  • 2022-12-23
  • 2021-10-01
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案