给定一个 N行 M 列的方格矩阵。
其中一部分方格是草地,其余部分是空地。
草地能够被燃烧,空地不会。
当某个草地在 t 时刻被点燃时,其上下左右四个方向的相邻方格中的草地方格也会在 t+1 时刻被点燃。
注意,空地方格无论如何都不可能被点燃。
现在,你可以选择最多两个草地,将它们点燃。
请你计算,使得所有草地都被点燃所需花费的最少时间。
输入格式
第一行包含整数 T,表示共有 T 组测试数据。
每组数据第一行包含两个整数 N,M。
接下来 N 行,包含一个 N×M 的字符矩阵,
#
表示草地,.
表示空地。输出格式
每组数据输出一个结果,每个结果占一行。
结果表示为
Case x: y
,其中 x 为组别编号(从 1 开始),y 点燃所有草地需要花费的最短时间。如果无法点燃所有草地或者所有方格都是空地则输出 −1。数据范围
1≤T≤100,
1≤N,M≤10。输入样例:
5 3 3 .#. ### .#. 3 3 .#. #.# .#. 3 3 ... #.# ... 3 3 ### ..# #.# 3 3 ... ... ...
输出样例:
Case 1: 1 Case 2: -1 Case 3: 0 Case 4: 2 Case 5: -1
简单的bfs,就是细节比较多
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cmath>
#include <queue>
#include <set>
#include <map>
#include <stack>
using namespace std;
//#define int long long
typedef pair<int,int>PII;
constexpr int N=10000;
int n,m;
vector<PII>p;
char s[12][12];
int st[12][12];
int res[12][12];
int g[12][12];
int ans=-1;
int dx[4]={1,0,0,-1},dy[4]={0,1,-1,0};
void bfs(int t1,int t2,int t3,int t4){
ans=0;
queue<PII>q;
q.push({t1,t2});
q.push({t3,t4});
res[t1][t2]=0,res[t3][t4]=0;
while(q.size()){
auto t=q.front();
//cout<<t.first<<" "<<t.second<<endl;
q.pop();
for(int i=0;i<4;i++){
int x=t.first+dx[i],y=t.second+dy[i];
if(x>=1&&x<=n&&y>=1&&y<=m&&!st[x][y]&&s[x][y]=='#'){
q.push({x,y});
st[x][y]=1;
res[x][y]=res[t.first][t.second]+1;
ans= max(ans,res[x][y]);
}
}
}
}
signed main()
{
ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t;
cin>>t;
int k=0;
while(t--) {
p.clear();
memset(g,0, sizeof g);
cin >> n >> m;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> s[i][j];
if (s[i][j] == '#') {
p.push_back({i, j});
g[i][j] = 1;
}
}
}
if (p.empty()) cout <<"Case "<< ++k << ": " << -1 << endl;
else if(p.size()==1) cout <<"Case "<< ++k << ": " << 0 << endl;
else {
int ww=1e7,tp=0;
for (int i = 0; i < p.size(); i++) {
for (int j = i + 1; j < p.size(); j++) {
tp=0;
memset(st,0, sizeof st);
memset(res,0, sizeof res);
st[p[i].first][p[i].second] = 1;
st[p[j].first][p[j].second] = 1;
//st[1][3] = 1;
//st[3][1] = 1;
//cout<<"........"<<endl;
bfs(p[i].first, p[i].second, p[j].first, p[j].second);
//bfs(1, 3, 3, 1);
for(int q1=1;q1<=n;q1++){
for(int q2=1;q2<=m;q2++){
if(st[q1][q2]!=g[q1][q2]) tp=1;
}
}
if(!tp) ww= min(ww,ans);
//cout<<tp<<endl;
//cout<<ans<<endl;
//cout<<"........"<<endl;
}
}
if(ww!=1e7)cout <<"Case "<< ++k << ": " <<ww<< endl;
else cout <<"Case "<< ++k << ": " <<-1<< endl;
}
}
return 0;
}