蓝桥云课 长草
题目:
链接 https://www.lanqiao.cn/problems/149/learning/
思路:
根据题目可得,使用bfs扩散,从多个源点出发,用map记录好每一个节点的步数,大于k个月的节点不继续进行扩散。
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn=1005;
queue<pair<int,int>> q;
map<pair<int,int>,int> ma;
char arr[maxn][maxn];
int ax[]= {1,-1,0,0},ay[]= {0,0,1,-1};
int main() {
int n,m;
cin >> n>>m;
for(int i=0; i<n; i++)
for(int j=0; j<m; j++) {
cin >> arr[i][j];
if(arr[i][j]=='g'){//把所有有草的地方入队
q.push({i,j});
ma[{i,j}] = 0;//记录步数
}
}
int k;
cin >> k;
while(!q.empty()) {//bfs
int x=q.front().first;
int y=q.front().second;
q.pop();
for(int i =0; i<4; i++) {//上下左右扩散
int x2 = x+ax[i];
int y2 = y+ay[i];
if(x2<0||x2>=n||y2<0||y2>=m) continue;//边界条件
if(arr[x2][y2]!='g'&&ma[{x,y}]<k) {//扩散的地方没有草并且步数小于k个月继续进行扩散
arr[x2][y2]='g';
q.push({x2,y2});
ma[{x2,y2}]=ma[{x,y}]+1;//记录步数
}
}
}
for(int i=0; i<n; i++) {//输出
for(int j=0; j<m; j++) {
cout << arr[i][j];
}
cout << endl;
}
return 0;
}