标签:links class lap sam soj 按钮组 lse mem 其他
Time Limit: 1 Sec Memory Limit: 128 MB 64bit IO Format: %lld
Submitted: 73 Accepted: 24
[Submit][Status][Web Board]
有一个由按钮组成的矩阵,其中每行有6个按钮,共5行;每个按钮的位置上有一盏灯。
当按下一个按钮后, 该按钮以及周围位置(上,下, 左,右)的灯都会改变状态。如果灯原来是点亮的,就会被熄灭。如果灯原来是熄灭的,则会被点亮。
在矩阵角上的按钮改变3盏灯的状态,在矩阵边上的按钮改变4盏灯的状态,其他的按钮改变5盏灯的状态。
与一盏灯毗邻的多个按钮被按下时,一个操作会抵消另一次操作的结果。
给定矩阵中每盏灯的初始状态,求一种按按钮方案,使得所有的灯都熄灭。
第一行是一个正整数N, 表示需要解决的案例数。
每个案例由5行组成,每一行包括6个数字,这些数字以空格隔开,可以是0或1。0表示灯的初始状态是熄灭,1表示灯的初始状态是点亮的。
对每个案例,首先输出一行字符串“PUZZLE #m:”,其中m是该案例的序号(从1开始计数)。
接着按照该案例的输入格式输出5行,每行6个数字。1表示需要把对应的按钮按下,0表示不需要按对应的按钮。每个数字以一个空格隔开。
2 0 1 1 0 1 0 1 0 0 1 1 1 0 0 1 0 0 1 1 0 0 1 0 1 0 1 1 1 0 0 0 0 1 0 1 0 1 0 1 0 1 1 0 0 1 0 1 1 1 0 1 1 0 0 0 1 0 1 0 0
PUZZLE #1: 1 0 1 0 0 1 1 1 0 1 0 1 0 0 1 0 1 1 1 0 0 1 0 0 0 1 0 0 0 0 PUZZLE #2: 1 0 0 1 1 1 1 1 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 1 1 0 1 1 0 1
代码如下:
#include <stdio.h>
int main() {
int i, j, k, n, t;
int flag, temp = 0;
int a1[7][8], a2[7][8];
scanf("%d", &n);
while (n--) {
temp++;
for (i = 0; i < 8; i++)
a1[0][i] = a2[0][i] = 0;
for (i = 1; i < 6; i++)
a1[i][0] = a2[i][0] = a1[i][7] = a2[i][7] = 0;
for (i = 1; i < 6; i++)
for (j = 1; j < 7; j++)
scanf("%d", &a1[i][j]);
for (i = 1; i < 7; i++)
a2[1][i] = 0;
LOOK: flag = 1;
for (i = 2; i < 6; i++)
for (j = 1; j < 7; j++)
a2[i][j] = (a2[i-1][j]+ a1[i-1][j] + a2[i-1][j-1] + a2[i-2][j] + a2[i-1][j+1] ) % 2;
for (j = 1; j < 7; j++) {
if (a1[5][j] != (a2[5][j] + a2[5][j-1] + a2[5][j+1] + a2[4][j]) % 2) {
flag = 0;
break;
}
}
while (!flag) {
a2[1][1]++; k = 1;
while (a2[1][k] > 1) {
a2[1][k] = 0;
k++;
a2[1][k]++;
}
goto LOOK;
}
printf("PUZZLE #%d:\n", temp);
for (i = 1; i < 6; i++) {
for (j = 1; j < 7; j++) {
printf("%d", a2[i][j]);
if (j == 6) printf("\n");
else printf(" ");
}
}
}
return 0;
}
WUST Online Judge - 2106: 熄灯问题
标签:links class lap sam soj 按钮组 lse mem 其他
原文地址:https://www.cnblogs.com/mcr-tcp/p/9170669.html