题意
一块地上面有草和空地,有两个人想要把草烧光,这样他俩就可以开心的OOXX,他俩都要在一块地上放火(每人只能放一次),可以在相同或者不同的位置放,火可以向四周蔓延,蔓延一次话费1分钟,问他俩把这块地上草烧完所用到的最小时间。
思路
每次枚举其中的两个点,记录最小时间
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
#define inf 0x3f3f3f3f
typedef long long ll;
int n,m,cnt,sum;
int v[11][11]; //标记是否以燃烧
char s[11][11];
int p;
int l[4][2]={
1,0,
-1,0,
0,1,
0,-1
};
struct node
{
int x,y;
int k;
};
int check(int x3,int y3)
{
//if(x3<0 || x3>=n || y3<0 || y3>=m || v[x3][y3] || s[x3][y3]!='#')
if(x3>=0 && x3<n && y3>= 0&& y3<m && v[x3][y3]!=1 && s[x3][y3]=='#')
return 1;
return 0;
}
int bfs(node a,node b)
{
memset(v,0,sizeof(v));
queue<node>q;
node w,h;
q.push(a);
q.push(b);
v[a.x][a.y]=1;
v[b.x][b.y]=1;
int ans=0;
while(!q.empty())
{
w=q.front();
q.pop();
ans=max(ans,w.k); //以最长用时为准
for(int i=0;i<4;i++)
{
h.x=w.x+l[i][0];
h.y=w.y+l[i][1];
if(check(h.x,h.y))
{
v[h.x][h.y]=1;
h.k=w.k+1;
sum--; //每push一次就燃烧一格草
q.push(h);
}
}
}
return ans;
}
int main()
{
int t;
scanf("%d",&t);
node w,h;
for(int ans=1;ans<=t;ans++)
{
cnt=0;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
{
scanf("%s",s[i]);
for(int j=0;j<m;j++)
if(s[i][j]=='#')
cnt++;
}
if(cnt<=2) //当小于等于两个格时
{
printf("Case %d: 0\n",ans);
continue;
}
p=inf;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
if(s[i][j]=='#')
{
w.x=i;
w.y=j;
w.k=0;
for(int a=i;a<n;a++)
{
for(int b=0;b<m;b++)
{
if((a!=i || b!=j) && s[a][b]=='#') //(a!=i || b!=j) 不与 w 中存的点是同一个
{
h.x=a;
h.y=b;
h.k=0;
sum=cnt-2; // 第一次点燃两个带草格不计时间
int c=bfs(w,h);
if(sum==0) //判断是否已全部燃烧完 若燃烧完则与已记录时间比较
p=min(p,c); //记录最短时间
}
}
}
}
}
if(p==inf)
printf("Case %d: -1\n",ans);
else
printf("Case %d: %d\n",ans,p);
}
return 0;
}
当时把 node w,h; 定义在了main 函数外当作全局变量 运行到第四组就出错了