有T组数据,每组数据包含一个n*m的图,其中#代表草,'.'代表没有草,两个小孩一起去烧草,两个小孩起始位置任意,求最少的烧完时间,所烧的第一块不花时间。
两个孩子位置任意,所以我们遍历整张图,选所有两个点的情况进行bfs测时间,并依次比较选择最少的时间。
#include <iostream>
#include <cstring>
#include <queue>
#include <cstdio>
#include <algorithm>using namespace std;int T, n, m, ans, sum, flag;
char M[15][15];
int used[15][15];
int cx[4] = {0, 0, -1, 1},cy[4] = {1, -1, 0, 0};struct l{int x, y;int step;
};bool check(int x, int y)
{if(x >= 0 && x < n && y >= 0 && y < m && M[x][y] == '#' && !used[x][y]) {return 1;}return 0;
}void BFS(int i, int j, int ii, int jj)
{sum = 0;l f, s;queue<l> q;f.x = i;f.y = j;used[i][j] = 1;f.step = 0;q.push(f);f.x = ii;f.y = jj;used[ii][jj] = 1;q.push(f);while(!q.empty()) {f = q.front();q.pop();for(int i = 0; i < 4; i++) {if(check(f.x + cx[i], f.y + cy[i])) {s.x = f.x + cx[i];s.y = f.y + cy[i];used[s.x][s.y] = 1;s.step = f.step + 1;sum = max(sum, s.step);q.push(s);}}}
}int main()
{cin >> T;int p = 0;while(T--) {p++;cin >> n >> m;for(int i = 0; i < n; i++) {for(int j = 0; j < m; j++) {cin >> M[i][j];}}ans = 1000000;for(int i = 0; i < n; i++) {for(int j = 0; j < m; j++) {if(M[i][j] == '#') {for(int ii = i; ii < n; ii++) {for(int jj = 0; jj < m; jj++) {if(M[ii][jj] == '#') {memset(used, 0, sizeof(used));BFS(i, j, ii, jj);flag = 1;for(int iii = 0; iii < n; iii++) {for(int jjj = 0; jjj < m; jjj++) {if(M[iii][jjj] == '#' && !used[iii][jjj]) {flag = 0;break;}}if(!flag) break;}if(flag) ans = min(ans, sum);}}}}}}if(ans == 1000000) {printf("Case %d: -1\n", p);}elseprintf("Case %d: %d\n", p, ans);}return 0;
}