错误原因
while(!q.empty()){}
修正
int days=q.size();
while(days--) {}
思路
本题因为是向四周长草,属于层次扩散,所以使用BFS
- BFS使用的是队列,首先在输入的时候就将长草的地方加入到队列中,并且将其状态设置为已访问
- 因为这次扩散,不是寻找最短路,所以bfs的使用应该放在循环里
- 我错误的代码是一次循环的BFS写法,而扩散是每次循环都进行一次BFS,因此队列中元素的个数是在不停的变化的
完整代码
#include<iostream>
#include<queue>
using namespace std;
const int N=10000;
int n,m,k; //n行,m列,k个月
char Map[N][N];
bool vis[N][N];
int dx[4]= {1,0,-1,0}; //右、下、左、上
int dy[4]= {0,-1,0,1};
struct node {
int x,y;
};
queue<node> q;
void bfs() {
int days=q.size();
while(days--) {
node now =q.front();
q.pop();
for(int i=0; i<4; i++) {
int tx=now.x+dx[i];
int ty=now.y+dy[i];
if(tx>=0 && ty>=0 && tx<n && ty<m && vis[tx][ty]==0) {
q.push(node{tx,ty});
vis[tx][ty]=1;
Map[tx][ty]='g';
}
}
}
}
int main() {
cin>>n>>m;
for(int i=0; i<n; i++) {
for(int j=0; j<m; j++) {
cin>>Map[i][j];
if(Map[i][j]=='g') {
vis[i][j]==1;
q.push(node {i,j});
}
}
}
cin>>k;
for(int i=0; i<k; i++) {
bfs();
}
for(int i=0; i<n; i++) {
for(int j=0; j<m; j++) {
cout<<Map[i][j];
}
cout<<endl;
}
return 0;
}