题目链接: http://acm.hust.edu.cn/vjudge/contest/121377#problem/I
题意; 现给出一个 n * m的表格, 其中 "#" 代表是放有干草的格子。 两兄弟在做游戏, 他们总共任取两个在放有干草的地方放火, 这些火只能在上下左右四个方向且有干草的地方蔓延,问你最短的时间让整个表格的干草都燃烧到是多少?若不能让整个表格的干草都燃烧,则输出"-1"
注意到 1<=n<= 10 && 1<=m<=10 所以直接进行 BFS 搜索即可
#include <iostream> #include <string.h> #include <stdio.h> #include <algorithm> #include <math.h> #include <vector> #include <queue> using namespace std; typedef long long LL; const int oo = 0xfffffff; const int maxn = 110007; char maps[20][20]; int v[20][20]; int n, m, cnt, t; int dir[4][2] = {{0, 1},{1, 0},{0, -1}, {-1, 0}}; struct node { int x, y, step; } s[500]; int OK() { for(int i=0; i<n; i++) for(int j=0; j<m; j++) { if(maps[i][j] == '#' && !v[i][j]) return 0; } return 1; } int BFS(node s, node e) { queue<node>Q; Q.push(s); Q.push(e); v[s.x][s.y]=1; v[e.x][e.y]=1; node q; while(Q.size()) { q = Q.front(); Q.pop(); for(int i=0; i<4; i++) { node k; k.x = q.x + dir[i][0]; k.y = q.y + dir[i][1]; if(k.x>=0 && k.x<n && k.y>=0 && k.y<m && maps[k.x][k.y]=='#' && !v[k.x][k.y]) { v[k.x][k.y] = 1; k.step = q.step + 1; Q.push(k); } } } return q.step; } void solve() { int i, j, ans; ans = oo; for(i=0; i<cnt; i++) for(j=i; j<cnt; j++) { memset(v, 0, sizeof(v)); int L = BFS(s[i], s[j]); if(L < ans && OK()) ans = L; } if(ans == oo) printf("Case %d: -1 ", t++); else printf("Case %d: %d ", t++, ans); } int main() { int T; t = 1; scanf("%d", &T); while(T --) { scanf("%d %d", &n, &m); for(int i=0; i<n; i++) scanf("%s", maps[i]); cnt = 0; for(int i=0; i<n; i++) { for(int j=0; j<m; j++) if(maps[i][j] == '#') { s[cnt].x=i, s[cnt].y = j, s[cnt].step = 0; cnt ++ ; } } solve(); } return 0; }