题目描述
但让我和辛美尔他们相遇的,就是老师教给我的无聊的魔法
创造花田的魔法是大魔法使芙拉梅最喜欢的魔法,它同样也给芙拉梅的弟子芙莉莲漫长的旅途带来了改变。
芙莉莲正在旅途之中,为了报答借宿的人家,她决定给房子后面的一片地用魔法种上鲜花。
我们把这一片地方看作是 n×m的矩形,对于这一个矩阵上的地形,我们作出如下的规定:
- `L` :表示这一格上是湖泊
- `M` :表示这一格上是山脉
- `G` :表示这一格上是青草
- `H` :表示这一格上是房屋
为了保证花儿能够正常的生长,并且要种的越多越好,芙莉莲决定按照以下的规矩来使用魔法:
- 山脉上不种植任何花朵
- 房屋以及房屋周围†^ \dagger†都不种上花朵
- 当且仅当如果一块湖泊周围都是湖泊的时候,在这一块湖泊上种植荷花,否则不种植任何花朵(荷花使用`S`来表示)
- 湖泊周围没有房屋限制的青草块种植水仙(水仙使用`N`来表示)
- 其他的没有上面规则限制的青草块种植苍月草(苍月草使用`B`来表示)
†^ \dagger† 周围表示在一个格子的左上、左下、右上、右下,以及上下左右八个方向上的八个格子,形式化的说:对于位于 (i,j)(i,j)(i,j) 的格子,位于 (i−1,j−1),(i−1,j),(i−1,j+1),(i,j+1),(i,j−1),(i+1,j−1),(i+1,j),(i+1,j+1)(i-1,j-1),(i-1,j),(i-1,j+1),(i,j+1),(i,j-1),(i+1,j-1),(i+1,j),(i+1,j+1)(i−1,j−1),(i−1,j),(i−1,j+1),(i,j+1),(i,j−1),(i+1,j−1),(i+1,j),(i+1,j+1) 的八个格子均在位于 (i,j)(i,j)(i,j) 的格子的周围。
注意
- 超过这一片矩形边界之外的地块,我们不予考虑,可以将他们近似的看成山脉
- 在一块地上种花**不会改变原本地形的性质**,比如湖泊上种荷花,湖泊本身还是必须看成湖泊
现在你需要根据上面的规则和给出的代表地形的矩阵,输出施过魔法之后的矩阵。
输入描述:
第一行两个整数 n, m (1≤n≤103, 1≤m≤103)n,含义与上述一致。 接下来给出 n 行 m 列的矩阵,包含了上述表示地形的大写字母,需要注意的是:不保证上面介绍的地形一定会出现,但是上面没有介绍过的地形一定不会出现。
输出描述:
输出也应该为包含大写字母的 n 行 m 列的矩阵,将代表你种的花的种类的大写字母替换掉原表示地形的字母。
示例1
输入
6 6 GLGGGG LLLGGG LLLGGH LLLGGG GGGGMM GHGGGG
输出
NLNNBB LLLNGG LSLNGH LLLNGG GGGNMM GHGBBB
题目大意
按照以下规则种花
- 山脉上不种植任何花朵
- 房屋以及房屋周围†^ \dagger†都不种上花朵
- 当且仅当如果一块湖泊周围都是湖泊的时候,在这一块湖泊上种植荷花,否则不种植任何花朵(荷花使用`S`来表示)
在一块地上种花**不会改变原本地形的性质**,比如湖泊上种荷花,湖泊本身还是必须看成湖泊,如果一个湖泊周围都是荷花,这个湖泊也要种荷花,这里是个坑,如果直接将湖泊种为该荷花,那么还需要加一个判断,如果湖泊周围是湖泊和荷花,种荷花,当然也可以再开具一个数组进行填,不改变原数组中湖泊
- 湖泊周围没有房屋限制的青草块种植水仙(水仙使用`N`来表示)
输入数据时将房屋,湖泊周围标记上,判断时只需判断周围有没有房屋和湖泊,若有房屋,不变,若有湖泊无房屋,种N。
- 其他的没有上面规则限制的青草块种植苍月草(苍月草使用`B`来表示)
若无房屋无湖泊种B。
解题代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
const int N=1e7+10;
char a[1010][1010];
char a1[1010][1010];
int b[1010][1010];//标记湖泊
int vis[1010][1010];
int dx[8]={-1,-1,0,1,1,1,0,-1};
int dy[8]={0,1,1,1,0,-1,-1,-1};
int n,m;
signed main()
{
std::ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
a1[i][j]=a[i][j];
if(a[i][j]=='H')
{
for(int k=0;k<8;k++)
{
int x1=i+dx[k],y1=j+dy[k];
if(x1>=1&&x1<=n&&y1>=1&&y1<=m)
vis[i+dx[k]][j+dy[k]]=1;//把房子周围的地块全标记上
}
}
if(a[i][j]=='L')
{
for(int k=0;k<8;k++)
{
int x1=i+dx[k],y1=j+dy[k];
if(x1>=1&&x1<=n&&y1>=1&&y1<=m)
b[i+dx[k]][j+dy[k]]=1;//把湖泊周围的地块标记上
}
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(a[i][j]=='L')
{
int sum=0;
for(int k=0;k<8;k++)
{
int x1=i+dx[k],y1=j+dy[k];
if(x1>=1&&x1<=n&&y1>=1&&y1<=m)
{
if(a[x1][y1]=='L')
sum++;
}
if(sum==8)a1[i][j]='S';//如果周围八个方向都是湖泊,则种S
}
}
else if(a[i][j]=='G')
{
if(vis[i][j]==0&&b[i][j]==1)
{
a1[i][j]='N';//如果周围无房屋,有湖泊种N
}
else if(vis[i][j]==0&&b[i][j]==0)
{
a1[i][j]='B';//如果无房屋,无湖泊,种B
}
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cout<<a1[i][j];
}
cout<<endl;
}
return 0;
}