题目链接:广大OJ1308
本题亦为广大15级第一次周赛的H题。
题目内容
Problem Description
有一个3*3的九宫格,每个格子上有一盏亮着的灯
1 2 3
4 5 6
7 8 9
当按动某盏灯的开关时,这盏灯和与它相邻的灯的状态都会发生改变(由亮变暗,由暗变亮)
例如当按动灯2时, 1 2 3 5这四盏灯的状态都要改变,当按动灯5时,2,4,5,6,8这5盏灯的状态都要改变
现在给你一个3*3的数字矩阵,表示每盏灯要按动的次数
例如数字矩阵
5 9 3
3 8 1
4 7 2 表示灯1要按5次,灯2要按动9次,灯3要按动3次……
Input
输入数据第一行是一个整数 T, 接下来有 T个例子
每个例子由3行整数组成,每行整数有3个,表示各盏灯要按动的次数(各个整数均在0到100之间)
Output
对于每个例子输出一个3*3的数字矩阵表示所有按动操作完成后9盏灯的状态, 0表示灯是
暗的,1表示灯是亮的
样例输出说明 :
例子1中只需要将灯1按动1次,所以1,2,4号灯变为暗而其他灯都是亮的
例子2中灯1,2,4各要按1次,最终的状态是灯1,3,7是暗的,其他灯是亮的
解法提示
假设数组元素 b[1] -> b[9] 表示相应位置操作的次数(b[1]表示灯1按动的次数, b[2]表示灯2按动的次数……)
数组元素 a[1] -> a[9] 表示相应位置总共变动的次数(a[1]表示灯1总共改变了a[1]次状态, a[2]表示灯2总共改变了a[2]次状态……)
那么显然 a[1] = b[1] + b[2] + b[4];
a[2] = b[1] + b[2] + b[3] + b[5];
。。。。。。。。。。。。。。。。。。。。。。。。。
Sample Input
2
1 0 0
0 0 0
0 0 0
1 1 0
1 0 0
0 0 0
Sample Output
001
011
111
010
111
011
解题思路
首先先化简输入。
要注意到按同一个开关两次就跟没按一样,也就是说,假设按了97次左上角的开关,那就跟按1次左上角的开关是等效的。
接着就是按题目说的做就行了。
先初始化灯全部是开的,然后依次判断9个开关有没有被按到,如果有的话就按照按到的来改变灯。
最多按9次开关,所以远远不会超时。
代码
#include<cstdio>
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int a[3][3];
for(int i=0;i<3;i++)for(int j=0;j<3;j++)
{
scanf("%d",&a[i][j]);
a[i][j]=a[i][j]%2;
}
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
int b=0;
b+=a[i][j];
if(i-1>=0)b+=a[i-1][j];
if(j-1>=0)b+=a[i][j-1];
if(i+1<=2)b+=a[i+1][j];
if(j+1<=2)b+=a[i][j+1];
b=b%2;
printf("%d",!b);
}
printf("\n");
}
}
}