浙江理工大学 2024 年程序设计竞赛(同步赛)I题

文章讲述了涂鸦大师gjlccc如何通过一系列操作改变一个n×n矩阵中格子的颜色,支持对行、列、对角线和反对角线进行涂色,并提供了AC代码实现。
摘要由CSDN通过智能技术生成

题目:I题
在涂鸦大师 gjlccc 眼中,世界是一个n×n 的矩阵,由n×n 个格子组成,左上角为 (1, 1),右下角为 (n, n)。为了方便涂色,gjlccc 做出了涂色的规划,并且颜色都暂时被 gjlccc 用小写字母来替代,后涂色的会覆盖之前的颜色。

在一开始,gjlccc 会告诉你世界有多大,也就是 n 的值。

n×n的矩阵中所有初始颜色都是字符 a。

请你帮涂鸦大师 gjlccc 快速解决这个问题,给世界颜色。

输入描述:

第一行一个正整数 n(1≤n≤1000),表示矩阵大小。

第二行一个正整数 q(1≤q≤1000),表示操作次数。

接下来 qqq 行,每行描述一个操作。

1 a b,对第 a(1≤a≤n)行的格子都涂上颜色 b。

2 a b,对第 a(1≤a≤n) 列的格子都涂上颜色 b。

3 c b,设 i(1≤i≤n) 为行号 j(1≤j≤n)为列号,对所有满足 (i+j)=c(2≤c≤2n) 的格子都涂上颜色 b。

4 d b,设 i(1≤i≤n) 为行号 j(1≤j≤n) 为列号,对所有满足 (i−j)=d(1−n≤d≤n−1)的格子都涂上颜色 b。

5 a,查询当前的矩阵第 a(1≤a≤n)行的颜色。

保证矩阵颜色均为小写字母。

样例输入:

5
9
5 1
1 5 b
5 2
2 5 c
5 3
3 6 d
5 4
4 0 e
5 5

样例输出:

aaaaa
aaaaa
aaaac
adaac
dbbbe

解题:

定义全局变量和矩阵:

char mp[1010][1010];

memset(mp,'a',sizeof(mp));//将矩阵中所有元素初始化为字符 'a',即初始颜色为 'a'。

n:矩阵的大小。
q:操作的次数。
x:当前操作的类型。
y:当前操作的参数。
s:当前操作的颜色。
根据操作类型 x 的不同,执行不同的操作:
操作类型为 1、2、3、4 时,分别对应对行、列、对角线和反对角线进行涂色。具体操作如下:对行进行涂色:遍历该行的所有格子,将其颜色修改为给定的颜色 s。
对列进行涂色:遍历该列的所有格子,将其颜色修改为给定的颜色 s。
对角线进行涂色:遍历矩阵中的每个格子,如果其行号和列号之和等于给定的值 y,则将其颜色修改为给定的颜色 s。
反对角线进行涂色:遍历矩阵中的每个格子,如果其行号减去列号等于给定的值 y,则将其颜色修改为给定的颜色 s。
操作类型为 5 时,查询某一行的颜色,并输出结果。

AC代码:

#include<bits/stdc++.h>//万能头文件
using namespace std;
char mp[1010][1010];
int main()
{
    int n,q,x,y;
    char s;
    cin>>n;
    cin>>q;
    memset(mp,'a',sizeof(mp));
    for(int z=0;z<q;z++)
    {
        cin>>x;
        if(x==1){
            cin>>y>>s;
            for(int i=1;i<=n;i++)
            {
                mp[y][i]=s;
            }
        }
        else if(x==2){
            cin>>y>>s;
            for(int i=1;i<=n;i++)
            {
                mp[i][y]=s;
            }
        }
        else if(x==3){
            cin>>y>>s;
            for(int i=1;i<=n;i++)
            {
                for(int j=1;j<=n;j++)
                {
                    if((i+j)==y)    mp[i][j]=s;
                }
            }
        }
        else if(x==4){
            cin>>y>>s;
            for(int i=1;i<=n;i++)
            {
                for(int j=1;j<=n;j++)
                {
                    if((i-j)==y)    mp[i][j]=s;
                }
            }
        }
        else if(x==5){
            cin>>y;
            for(int i=1;i<=n;i++)
            {
                cout<<mp[y][i];
            }
            cout<<endl;
        }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值