题意:是否有两个少于两个的草堆,如果没有输出-1,否者输出火烧的时间。
枚举两个人选着的位置然后bfs
#include
#include
#include
#include
using namespace std;
const int N = 20;
char str[N][N];
bool vis[N][N];
int n, m;
struct node
{
int x,y;
int step;
node() {}
node(int xx, int yy, int ss)
{
x = xx;
y = yy;
step = ss;
}
};
queue
que; int dir[4][2] = { {1, 0}, {-1, 0,}, {0, 1}, {0, -1} }; int bfs(int x1, int y1, int x2, int y2) { int ans = 0; while(!que.empty()) que.pop(); memset(vis, 0, sizeof(vis)); if(str[x1][y1] == '#') { que.push(node(x1, y1, 0)); vis[x1][y1] = 1; } if(str[x2][y2] == '#') { que.push(node(x2, y2, 0)); vis[x2][y2] = 1; } while(!que.empty()) { node tmp = que.front(); que.pop(); ans = max(ans, tmp.step); for(int i = 0; i < 4; i++) { int x = tmp.x + dir[i][0]; int y = tmp.y + dir[i][1]; if(0 <= x && x < n && 0 <= y && y < m && str[x][y] == '#' && !vis[x][y]) { vis[x][y] = 1; que.push(node(x, y, tmp.step+1)); } } } int flag = 0; for(int i = 0; i < n; i++) for(int j = 0; j < m; j++) { if(str[i][j] == '#' && !vis[i][j]) { flag = 1; return -1; } } return ans; } int main(void) { int T; scanf("%d", &T); int cnt = 0; while(T--) { scanf("%d%d", &n, &m); for(int i = 0; i < n; i++) scanf("%s", str[i]); int x1, y1, x2, y2; int ans = 10000; for(x1 = 0; x1 < n; x1++) { for(x2 = 0; x2 < n; x2++) { for(y1 = 0; y1 < m; y1++) { for(y2 =0; y2 < m; y2++) { if(str[x1][y1] == str[x2][y2] && str[x1][y1] == '#'){ int tmp = bfs(x1, y1, x2, y2); // printf("x1=%d y1=%d x2=%d y2=%d tmp=%d\n", x1, y1, x2, y2, tmp); if(tmp != -1) ans = min(ans, tmp); } } } } } if(ans == 10000) printf("Case %d: %d\n", ++cnt, -1); else printf("Case %d: %d\n", ++cnt, ans); } return 0; }