集美大学2024年团体程序设计天梯赛模拟赛 H 创造花田的魔法

题目描述

但让我和辛美尔他们相遇的,就是老师教给我的无聊的魔法

创造花田的魔法是大魔法使芙拉梅最喜欢的魔法,它同样也给芙拉梅的弟子芙莉莲漫长的旅途带来了改变。  

芙莉莲正在旅途之中,为了报答借宿的人家,她决定给房子后面的一片地用魔法种上鲜花。  

我们把这一片地方看作是 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) 的格子的周围。

注意

  1. 超过这一片矩形边界之外的地块,我们不予考虑,可以将他们近似的看成山脉
  2. 在一块地上种花**不会改变原本地形的性质**,比如湖泊上种荷花,湖泊本身还是必须看成湖泊

现在你需要根据上面的规则和给出的代表地形的矩阵,输出施过魔法之后的矩阵。

输入描述:

第一行两个整数 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值