問題描述
小明有一塊空地,他將這塊空地劃分爲 n 行 m 列的小塊,每行和每列的長度都爲 1。
小明選了其中的一些小塊空地,種上了草,其他小塊仍然保持是空地。
這些草長得很快,每個月,草都會向外長出一些,如果一個小塊種了草,則它將向自己的上、下、左、右四小塊空地擴展,這四小塊空地都將變爲有草的小塊。
請告訴小明,k 個月後空地上哪些地方有草。
輸入格式
輸入的第一行包含兩個整數 n, m。
接下來 n 行,每行包含 m 個字母,表示初始的空地狀態,字母之間沒有空格。如果爲小數點,表示爲空地,如果字母爲 g,表示種了草。
接下來包含一個整數 k。
輸出格式
輸出 n 行,每行包含 m 個字母,表示 k 個月後空地的狀態。如果爲小數點,表示爲空地,如果字母爲 g,表示長了草。
樣例輸入
4 5
.g…
…
…g…
…
2
樣例輸出
gggg.
gggg.
ggggg
.ggg.
評測用例規模與約定
對於 30% 的評測用例,2 <= n, m <= 20。
對於 70% 的評測用例,2 <= n, m <= 100。
對於所有評測用例,2 <= n, m <= 1000,1 <= k <= 1000。
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int n, m;
vector<string> data;
void fun (int k) {
while (k) {
for (int i = 0; i < n; i++ ) {
for (int j = 0; j < m; j++ ) {
if (data[i][j] == 'g') {
if (j-1 >= 0 && data[i][j-1] == '.')
data[i][j-1] = 'w';
if (j+1 < m && data[i][j+1] == '.')
data[i][j+1] = 'w';
if (i-1 >= 0 && data[i-1][j] == '.')
data[i-1][j] = 'w';
if (i+1 < n && data[i+1][j] == '.')
data[i+1][j] = 'w';
}
}
}
for (int i = 0; i < n; i++ ) {
for (int j = 0; j < m; j++ ) {
if (data[i][j] == 'w') {
data[i][j] = 'g';
}
}
}
k --;
}
return ;
}
int main ()
{
int k;
cin >> n >> m;
for (int i = 0; i < n; i++ ) {
string str;
cin >> str;
data.push_back(str);
}
cin >> k;
fun(k);
for (int i = 0; i < n; i++ ) {
cout << data[i] << endl;
}
return 0;
}