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