一:题目
题目描述
小明有一块空地,他将这块空地划分为 nn 行 mm 列的小块,每行和每列的长度都为 1。
小明选了其中的一些小块空地,种上了草,其他小块仍然保持是空地。
这些草长得很快,每个月,草都会向外长出一些,如果一个小块种了草,则它将向自己的上、下、左、右四小块空地扩展,
这四小块空地都将变为有草的小块。请告诉小明,kk 个月后空地上哪些地方有草。
输入描述
输入的第一行包含两个整数 n, mn,m。
接下来 nn 行,每行包含 mm 个字母,表示初始的空地状态,字母之间没有空格。如果为小数点,表示为空地,如果字母为 gg,表示种了草。
接下来包含一个整数 kk。 其中,2 \leq n, m \leq 1000,1 \leq k \leq 10002≤n,m≤1000,1≤k≤1000。
输出描述
输出 nn 行,每行包含 mm 个字母,表示 kk 个月后空地的状态。如果为小数点,表示为空地,如果字母为 gg,表示长了草。
输入输出样例
示例
输入
4 5
.g...
.....
..g..
.....
2
copy
输出gggg.
gggg.
ggggg
.ggg.
二:上码
/**思路:1.这里要用到BFS遍历,什么意思呢?BFS遍历广度优先遍历,就是我们需要遍历该节点的临结点,如果临界点为 . 的话那就给其赋值,同时记得标记上该结点已经访问过了,等到该访问该节点时,我们就不用再访问了。 2.同时还要注意一个问题,我们需要考虑到处在边界的元素,因为边界上无 上/左/右/下对此的处理 我们是从[1,1]开始我们的第一个元素,同时尽量将我们的数组范围开的大一些 **/
#include<bits/stdc++.h>
using namespace std;char ans[1005][1005];
int visited[1005][1005] = {false};
int m,n,k;void Bfs(int i,int j) {if(ans[i][j] == '.' && visited[i][j] == false){ans[i][j] = 'g';visited[i][j] = true; }}int main () {cin >> m >> n;for (int i = 1; i <=m; i++) {for (int j = 1; j <= n; j++) {cin >> ans[i][j];}} cin >> k;while(k--) {memset(visited,false,sizeof(visited));//这个是为了解决 不同月分草的生长。 for (int i = 1; i <= m; i++) {for (int j = 1; j <= n; j++) {if (ans[i][j] == 'g' && visited[i][j] == false) {Bfs(i-1,j);Bfs(i+1,j);Bfs(i,j-1);Bfs(i,j+1);} }} }for (int i = 1; i <= m; i++) {for (int j = 1; j <= n; j++) {cout << ans[i][j];}cout << endl;}}