[转载] $CF275A$ 题解

阅读原文

给定一张 (3 imes 3) 的棋盘(起初全为 (1) ),每格均有一个操作次数。操作是将其上的数以及上下左右四格的数取反( (0) 变为 (1) , (1) 变为 (0) )。输出所有操作结束后的局面。

题目比较简单,直接按题意模拟即可。

本质上,同一格偶数次操作后局面不会有任何变化,于是不用考虑。为了加速,只有操作次数为偶数次时才修改。修改前要判定被修改的格子是否合法。

然后就结束了。如有疑问,评论区见。

代码如下:

#include<bits/stdc++.h>
using namespace std;
inline int read()
{
	int ret=0,f=1;
	char ch=getchar();
	while(ch>'9'||ch<'0')
	{
		if(ch=='-')
			f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
		ret=(ret<<1)+(ret<<3)+ch-'0';
		ch=getchar();
	}
	return ret*f;
}
int a[4][4];
bool b[4][4];
inline void modify(int x,int y)
{
	if(b[x][y])
		b[x][y]=0;
	else
		b[x][y]=1;
}
int main()
{
	for(register int i=1;i<=3;i++)
		for(register int j=1;j<=3;j++)
			a[i][j]=read();
	for(register int i=1;i<=3;i++)
		for(register int j=1;j<=3;j++)
			b[i][j]=1;
	for(register int i=1;i<=3;i++)
	{
		for(register int j=1;j<=3;j++)
		{
			if(a[i][j]&1)
			{
				modify(i,j);
				if(i-1>0)
					modify(i-1,j);
				if(j-1>0)
					modify(i,j-1);
				if(i+1<4)
					modify(i+1,j);
				if(j+1<4)
					modify(i,j+1);
			}
		}
	}
	for(register int i=1;i<=3;i++)
	{
		for(register int j=1;j<=3;j++)
			printf("%d",b[i][j]);
		printf("
");
	}
	return 0;
}
原文地址:https://www.cnblogs.com/Peter0701/p/11403027.html