题目
【问题描述】
小明有一块空地,他将这块空地划分为 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。
思路
stepⅠ:接受输入(需要处理第一行输入结束后的多余字符)
stepⅡ:将地的状态数组s赋值给ans
stepⅢ:遍历s,s有草的时候改变ans的值
stepⅣ:本月结束后,将此时的状态ans赋值给s,若还未到k个月,则转stepⅢ,否则,转stepⅤ
stepⅤ:输出ans
代码实现
#include <stdio.h>
#include <string.h>
#define maxn 1005
char s[maxn][maxn];
char ans[maxn][maxn];
int main(void)
{
int n = 0,m = 0,k = 0;
//input
scanf("%d%d",&n,&m); //n:row,m:column
char c = getchar(); //吃掉空格
while(c != '\n')
{
c = getchar();
}
for(int i = 0;i < n;i++)
{
gets(s[i]);
}
scanf("%d",&k);
//deal
memcpy(ans, s,sizeof(s)); //赋值到ans中
while(k--)
{
for(int i = 0;i < n;i++)
{
for(int j = 0;j < m;j++)
{
if(s[i][j] == 'g')
{
//处理边界
if(i >= 1)
{
ans[i-1][j] = 'g';
}
if(j >= 1)
{
ans[i][j-1] = 'g';
}
ans[i+1][j] = 'g';
ans[i][j+1] = 'g';
}
}
}
memcpy(s,ans, sizeof(ans)); //一个月之后把草坪整体的状态传给s,进行迭代
}
//output
for(int i = 0;i < n;i++)
{
for(int j = 0;j < m;j++)
{
printf("%c",ans[i][j]);
}
printf("\n");
}
return 0;
}
后记
这是我的第一篇blog,之所以选择写出来,是因为我自己写完之后,想看看大家是怎么写的,却发现大家都是用bfs模板(也许我搜索的方式有问题),我就非常想知道,模板式写法优势在哪儿,因为经常在看算法题解析的时候看到“这是一道典型的bfs模板题”,但我却从未直接套用模板解决过问题,希望碰巧看到我这篇blog的胖友能解决我的疑惑╯^╰
另外由于我没在蓝桥杯练习系统中找到这道题,万一碰巧有胖友在测试的时候发现了错误,也希望能告诉我欧quq