题意:
给定一个平面图 . 为空地(不着火) # 为草
开始可以选1-2个草堆点燃,每隔一秒会把上下左右的草引燃(开始时间为0秒)
问把所有草烧光的最少时间
#include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; const int INF=1000000000; inline int min(int a,int b){return a<b?a:b;} inline int max(int a,int b){return a>b?a:b;} char mp[15][15]; int v[15][15]; int R,C; int dir[4][2]={0,1,0,-1,1,0,-1,0}; struct Node{ int x,y; Node(int x=0,int y=0):x(x),y(y){} }t1,t2; int bfs(int a,int b,int c,int d) { int i,j,ans=0; for(i=0;i<15;i++) for(j=0;j<15;j++) v[i][j]=INF; queue<Node> Q; Q.push(Node(a,b)); Q.push(Node(c,d)); v[a][b]=v[c][d]=0; while(!Q.empty()) { t1=Q.front();Q.pop(); for(i=0;i<4;i++) { t2.x=t1.x+dir[i][0];t2.y=t1.y+dir[i][1]; if(mp[t2.x][t2.y]=='#' && v[t2.x][t2.y]>v[t1.x][t1.y]+1) { Q.push(t2);v[t2.x][t2.y]=v[t1.x][t1.y]+1; } } } for(i=1;i<=R;i++) { for(j=1;j<=C;j++) if(mp[i][j]=='#') ans=max(ans,v[i][j]); } return ans; } int Slove() { int Min=INF; int i,j,k,m; for(i=1;i<=R;i++) { for(j=1;j<=C;j++) { if(mp[i][j]=='#') { for(k=i;k<=R;k++) { for(m=1;m<=C;m++) if(mp[k][m]=='#') { if(i==k && j==m) continue; Min=min(Min,bfs(i,j,k,m)); } } } } } return Min==INF?-1:Min; } int main() { int cnt,t,Icase,i,j; scanf("%d",&t); for(Icase=1;Icase<=t;Icase++) { cnt=0; scanf("%d %d",&R,&C); for(i=1;i<=R;i++) { getchar(); for(j=1;j<=C;j++) { scanf("%c",&mp[i][j]); if(mp[i][j]=='#') cnt++; } } if(cnt<=2) {printf("Case %d: 0 ",Icase);continue;} for(i=0;i<=R;i++) mp[i][0]=mp[i][C+1]='.'; for(i=0;i<=C;i++) mp[0][i]=mp[R+1][i]='.'; printf("Case %d: %d ",Icase,Slove()); } return 0; }