这是一道洛谷上的题目
题目描述
你有一个 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;
}
这道题的判断函数可以根据题意判断一半的数即可