比较简单的一道BFS。
题意:给一个nXm的矩阵,“.”代表空地,“#”代表草地,让你选择两个(或以下)草地点火,每过一秒火会向草地相邻的菜地蔓延,问你至少需要多长时间可以蔓延到所有草地。
n和m都非常小,直接枚举两个起始点即可,然后bfs,把接下来要烧的草地放到队列里,队列空了之后判断是否烧干净即可。
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <algorithm>
//#include <map>
#include <queue>
#include <vector>
#include <stack>
#include <string>
#define N 12
#define ll long long
#define INF 0x7fffffff
using namespace std;
struct Node{
int x,y,cnt;
Node(int x = 0,int y = 0,int cnt = 0):x(x),y(y),cnt(cnt){};
};
int dx[4] = {-1,1,0,0};
int dy[4] = {0,0,-1,1};
int cases,t;
int m,n;
char map[N][N];
char tmp[N][N];
bool check(){
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(tmp[i][j] == '#'){
return 0;
}
}
}
return 1;
}
int ans = INF;
int main(){
int i,j,k;
scanf("%d",&cases);
while(t < cases){
t++;
ans = INF;
scanf("%d%d",&n,&m);
getchar();
int cnt = 0;
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
scanf("%c",&map[i][j]);
if(map[i][j] == '#'){
cnt++;
}
}
getchar();
}
if(cnt <= 2){
printf("Case %d: 0\n",t);
continue;
}
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
for(int i1=1;i1<=n;i1++){
for(int j1=1;j1<=m;j1++){
if(map[i][j] == '#' && map[i1][j1] == '#'){
memcpy(tmp,map,sizeof(map));
queue<Node>Q;
Q.push(Node(i,j,0));
tmp[i][j] = '0';
Q.push(Node(i1,j1,0));
tmp[i1][j1] = '0';
Node x;
while (!Q.empty())
{
x = Q.front();Q.pop();
for(k=0;k<4;k++){
int sx = x.x + dx[k],sy = x.y + dy[k];
if(sx >0 &&sx <= n && sy > 0 && sy <= m && tmp[sx][sy] == '#'){//这里可能要加条件
Q.push(Node(sx,sy,x.cnt+1));
tmp[sx][sy] = '0' + x.cnt + 1;
}
}
}
if(check()){
ans = min(ans,x.cnt);
}
}
}
}
}
}
if(ans == INF){
printf("Case %d: -1\n",t);
}else{
printf("Case %d: %d\n",t,ans);
}
}
return 0;
}