WUST Online Judge - 2106: 熄灯问题
Posted mcr-tcp
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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: ", temp); for (i = 1; i < 6; i++) { for (j = 1; j < 7; j++) { printf("%d", a2[i][j]); if (j == 6) printf(" "); else printf(" "); } } } return 0; }
以上是关于WUST Online Judge - 2106: 熄灯问题的主要内容,如果未能解决你的问题,请参考以下文章
WUST Online Judge - 2147: 与时间赛跑
WUST Online Judge - 2104: 特殊密码锁