Module: Iterar sobre todos os subpadrões de uma determinada máscara


Problem

5 /7


Eric e a placa de LED

Theory Click to read/hide

Acontece que é necessário enumerar todas as sequências de bits de um determinado comprimento. Ou seja, iterar sobre todas as opções possíveis, onde para cada objeto um dos dois estados possíveis é selecionado.

Em tais situações, é possível implementar a enumeração usando máscaras de bits. A vantagem dessa abordagem é que esse código funciona de forma não recursiva e opera em números em vez de coleções ou similares, o que melhora muito o desempenho.

O código geral usando bitmasks é dado abaixo: int; // número de oobjects (comprimento da sequência de bits) for (int mask = 0; mask < (1 << n); mask++) { // percorre todos os números de 0 a 2^n - 1, onde cada número corresponde a um bitmask // a máscara de número atual é uma bitmask, onde o i-ésimo bit especifica o estado do i-ésimo objeto for (int i = 0; i < n; i++) { // iterar sobre n bits para entender o estado de cada objeto if ((1 << i) & mask) { // verifica se o i-ésimo bit é igual a um // processa a opção que o i-ésimo objeto tem o estado '1' } else { // caso quando o i-ésimo bit é zero // processa a opção que o i-ésimo objeto do estado '0' } } }
Este código é executado em O(2^n * f(n)), onde f(n) é o tempo que você leva para processar um determinado iterável.

Problem

Eric encontrou uma placa de LED na antiga garagem de seu avô. No entanto, ele ficou surpreso ao ver que, quando ativados, os diodos não estavam sincronizados entre si. Ou seja, alguns queimaram e outros não.
A placa em si acabou sendo incomum. É uma grade retangular com n linhas e m colunas, onde cada célula contém um diodo. Perto de cada linha existe uma alavanca que liga todos os diodos desta linha (os diodos de queima apagam e vice-versa). Cada coluna tem as mesmas alavancas (que eu uso os diodos na coluna correspondente).
Eric se perguntou se era possível mudar os diodos para o mesmo estado trocando as alavancas.

Entrada:
A primeira linha contém dois números naturais n e m (1 <= n, m <= 7) - o número de linhas e colunas no tabuleiro, respectivamente.
Depois, há n linhas com m números cada - os estados dos diodos, onde 0 significa que o diodo está desligado e 1 que está ligado.

Saída:
Imprima "SIM" se for possível colocar os diodos em um estado e "NÃO" se for impossível.

Exemplos:
 
Entrada Saída
2 2
0 1
10
SIM
2 2
0 1
0 0
NÃO

Explicação:
No primeiro exemplo, você pode alternar todos os diodos na primeira linha e, em seguida, alternar todos os diodos na primeira coluna. Então todos os diodos estarão desligados.