【题目链接】click here~~
【题目大意】:
两个熊孩子要把一个正方形上的草都给烧掉,他俩同时放火烧,烧第一块的时候是不花时间的,每一块着火的都可以在下一秒烧向上下左右四块#代表草地,.代表着不能烧的。问你最少花多少时间可以烧掉,如果烧不掉就输出-1
【解题思路】:
数据比较弱的情况下直接暴力枚举每块草坪上可以放的位置,比较高端的写法目前没有想到,以后想到了文章更新下~~
ps:由于一个细节没注意,导致WA了几乎一页,还以为FZU 判题出错了,后来突然发现每次从队列里拿出队首的元素,才是和maxx比较时间的最大可能!
代码:
//FZU 2150 #ifndef _GLIBCXX_NO_ASSERT #include <cassert> #endif #include <cctype> #include <cerrno> #include <cfloat> #include <ciso646> #include <climits> #include <clocale> #include <cmath> #include <csetjmp> #include <csignal> #include <cstdarg> #include <cstddef> #include <cstdio> #include <cstdlib> #include <cstring> #include <ctime> // C++ #include <algorithm> #include <bitset> #include <complex> #include <deque> #include <exception> #include <fstream> #include <functional> #include <iomanip> #include <ios> #include <iosfwd> #include <iostream> #include <istream> #include <iterator> #include <limits> #include <list> #include <locale> #include <map> #include <memory> #include <new> #include <numeric> #include <ostream> #include <queue> #include <set> #include <sstream> #include <stack> #include <stdexcept> #include <streambuf> #include <string> #include <typeinfo> #include <utility> #include <valarray> #include <vector> using namespace std; #define rep(i,j,k) for(int i=(int)j;i<(int)k;++i) #define per(i,j,k) for(int i=(int)j;i>(int)k;--i) #define lowbit(a) a&-a #define Max(a,b) a>b?a:b #define Min(a,b) a>b?b:a #define mem(a,b) memset(a,b,sizeof(a)) typedef long long LL; typedef unsigned long long LLU; typedef double db; const int N=105; const int inf=0x3f3f3f3f; int n,m,T; char mat[25][25]; bool vis[N][N]; int dir4[4][2]= {{1,0},{0,1},{-1,0},{0,-1}}; int dir8[8][2]= {{1,0},{1,1},{0,1},{-1,1},{-1,0},{-1,-1},{0,-1},{1,-1}}; int dir6[6][3]= {{0,0,1},{0,0,-1},{0,1,0},{0,-1,0},{1,0,0},{-1,0,0}};///六个方向 struct node { int Coor_x; int Coor_y; int step; } q,p,mapp[N]; bool ok(int dx,int dy) { if(dx>=0&&dx<n&&dy>=0&&dy<m) return true; return false; } int ans; void getMat() { ans=0; for(int i=0; i<n; ++i){ scanf("%s",mat[i]); for(int j=0; j<m; ++j){ if(mat[i][j]=='#'){ ans++; mapp[ans].Coor_x=i; mapp[ans].Coor_y=j; } } } } int bfs(int x1,int y1,int x2,int y2) { int maxx=0; q.Coor_x=x1,q.Coor_y=y1,q.step=0; p.Coor_x=x2,p.Coor_y=y2,p.step=0; queue <node> vall; vall.push(q); vall.push(p); while(!vall.empty()){ node q1,p1=vall.front(); vall.pop(); for(int i=0; i<4; ++i){ int dx=p1.Coor_x+dir4[i][0]; int dy=p1.Coor_y+dir4[i][1]; if(ok(dx,dy)&&!vis[dx][dy]&&mat[dx][dy]=='#'){ vis[dx][dy]=true; q1.Coor_x=dx; q1.Coor_y=dy; q1.step=p1.step+1; vall.push(q1); } } maxx=Max(maxx,p1.step);///大坑!,注意和vall.front() 比较 } return maxx; } int main() { scanf("%d",&T); int tot=1; while(T--){ scanf("%d%d",&n,&m); getMat(); printf("Case %d: ",tot++); if(ans<=2){ puts("0"); continue; } int minn=inf; for(int i=0; i<ans; ++i){ for(int j=i; j<ans; ++j){ mem(vis,false); vis[mapp[i].Coor_x][mapp[i].Coor_y]=true; vis[mapp[j].Coor_x][mapp[j].Coor_y]=true; bool flag=false; int _minn=bfs(mapp[i].Coor_x,mapp[i].Coor_y,mapp[j].Coor_x,mapp[j].Coor_y); for(int k=0; k<n; ++k){ for(int l=0; l<m; ++l){ if(mat[k][l]!='#') continue; if(!vis[k][l]){ flag=true; break; } } } if(!flag) minn=Min(_minn,minn); } } if(minn==inf) puts("-1"); else printf("%d\n",minn); } return 0; }