WUST Online Judge - 2106: 熄灯问题

2106: 熄灯问题

Time Limit: 1 Sec  Memory Limit: 128 MB   64bit IO Format: %lld
Submitted: 73  Accepted: 24
[Submit][Status][Web Board]

Description

有一个由按钮组成的矩阵,其中每行有6个按钮,共5行;每个按钮的位置上有一盏灯。

当按下一个按钮后, 该按钮以及周围位置(上,下, 左,右)的灯都会改变状态。如果灯原来是点亮的,就会被熄灭。如果灯原来是熄灭的,则会被点亮。

在矩阵角上的按钮改变3盏灯的状态,在矩阵边上的按钮改变4盏灯的状态,其他的按钮改变5盏灯的状态。

与一盏灯毗邻的多个按钮被按下时,一个操作会抵消另一次操作的结果。

给定矩阵中每盏灯的初始状态,求一种按按钮方案,使得所有的灯都熄灭。

Input

第一行是一个正整数N, 表示需要解决的案例数。

每个案例由5行组成,每一行包括6个数字,这些数字以空格隔开,可以是0或1。0表示灯的初始状态是熄灭,1表示灯的初始状态是点亮的。

Output

对每个案例,首先输出一行字符串“PUZZLE #m:”,其中m是该案例的序号(从1开始计数)。

接着按照该案例的输入格式输出5行,每行6个数字。1表示需要把对应的按钮按下,0表示不需要按对应的按钮。每个数字以一个空格隔开。

Sample Input

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

Sample Output

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;
}

猜你喜欢

转载自www.cnblogs.com/mcr-tcp/p/9170669.html