测试图片的对称性,C语言

这是一道洛谷上的题目

题目描述

你有一个 n 行 m 列的图片(矩阵),该图片的像素为 n×m。

初始时,所有像素块均为黑色,RGB 是 (0,0,0)。每一次操作可以将一个像素块的 RGB 中的一个数字改变。

在每次操作过后,请你输出图片是否左右对称?

左右对称:即对于任何的 i,j,总满足第 i 行第 j 列的像素与第 i 行第 m−j+1 列的像素的 RGB 值相等。

输入格式

第一行三个整数 n,m,q 代表操作次数。

接下来 q 行,每行输入四个整数i,j,t,c,表示将第i 行第j 列的格子的 RGB 值的第 t 个数增加 c,任何一个 RGB 值的任何一个数如果超出 255则自动对 256 取模。

输出格式

每次操作过后,如果图片左右对称,输出 Yes,否则输出 No。每组询问的输出之间用换行隔开。

输入输出样例

输入 

6 6 9
1 2 3 4
5 6 3 4
1 5 3 4
5 1 3 4
1 3 2 260
1 4 2 4
2 2 3 5
2 5 3 7
2 2 3 258

输出 

No
No
No
Yes
No
Yes
No
No
Yes

下面来看一下我的代码

​#include<stdio.h>
int n,m;
struct ss
{
    int a,b,c;
};
int fun(struct ss ch[n+1][m+1])
{int i,j;
    for(i=1;i<=n;i++)
        for(j=1;j<=(m+1)/2;j++)
        if(ch[i][j].a!=ch[i][m-j+1].a||ch[i][j].b!=ch[i][m-j+1].b||ch[i][j].c!=ch[i][m-j+1].c)return 0;
return 1;
}
int main()
{
    int i,j,t,c,q,o;
    scanf("%d%d%d",&n,&m,&q);//n,m表示行列数,q为操作次数
    if(!(n>=1&&n<=100&&m>=1&&m<=100&&q>=1&&q<=500))return 0;//限制范围
    struct ss ch[n+1][m+1];
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
        ch[i][j].a=ch[i][j].b=ch[i][j].c=0;//将所有RGB值置为0
    for(o=0;o<q;o++)
    {
        scanf("%d%d%d%d",&i,&j,&t,&c);getchar();
        if(!(i>=1&&i<=n&&j>=1&&j<=m&&t>=1&&t<=3&&c>=1&&c<=1e9))return 0;//限制范围
        if(t==1)ch[i][j].a=(ch[i][j].a+c)%256;
        else if(t==2)ch[i][j].b=(ch[i][j].b+c)%256;
        else if(t==3)ch[i][j].c=(ch[i][j].c+c)%256;
        if(fun(ch))printf("Yes\n");
        else printf("No\n");
    }
    return 0;
}


这道题的判断函数可以根据题意判断一半的数即可

  • 21
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值