蓝桥打卡-7-长草(bfs变形)
作者:
因为yxc爱上编程
,
2024-04-07 11:32:56
,
所有人可见
,
阅读 28
注意K个月的限制控制了队列中点的邻接点是否还扩散
处理办法:每次只扩散队列中的点的邻接点,邻接点不加入队列,当下次k值的时候
再把满足需要的点重新加入队列进行扩展,也保证了后面的邻接点扩散的次数与前##面的不同
#include <iostream>
#include<algorithm>
#include<queue>
#define x first
#define y second
using namespace std;
typedef pair<int,int> PII;
queue<PII>q;
const int N=1010;
char M [N][N];
bool st[N][N];
int n,m,k;
void bfs(){
int dx[]={-1,0,1,0};
int dy[]={0,1,0,-1};
while(k--){
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
if(M[i][j]=='g')
{
q.push({i,j});
st[i][j]=true;
}
while(q.size()){ //变为了每次只扩展队列里面的点的邻接点,扩展完后pop掉
auto t=q.front();//第二次k的时候再把所有邻接点加入在扩展其邻接点
q.pop();
for(int i=0;i<4;i++)
{
int a=t.x+dx[i];
int b=t.y+dy[i];
if(a>=0&&a<n&&b>=0&&b<m&&!st[a][b])
{
M[a][b]='g';
//q.push({a,b});每次只扩展队列里面现有的点的邻接点
//至于其临界点扩不扩展要根据k值来看**************
st[a][b]=true;
}
}
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
cin>>M[i];
scanf("%d",&k);
bfs();
for(int i=0;i<n;i++)
cout<<M[i]<<endl;
return 0;
}