Module: 지정된 마스크의 모든 하위 패턴을 반복합니다.


Problem

5 /7


에릭과 LED 보드

Theory Click to read/hide

특정 길이의 모든 비트 시퀀스를 열거해야 하는 경우가 발생합니다. 또는 다른 말로 가능한 모든 옵션을 반복하여 각 개체에 대해 두 가지 가능한 상태 중 하나를 선택합니다.

이러한 상황에서 비트 마스크를 사용하여 열거를 구현할 수 있습니다. 이 접근 방식의 장점은 이러한 코드가 비재귀적으로 작동하고 컬렉션 등이 아닌 숫자에 대해 작동하므로 성능이 크게 향상된다는 것입니다.

비트마스크를 사용하는 일반적인 코드는 다음과 같습니다. 정수; // oobject 수(비트 시퀀스의 길이) for (int mask = 0; mask < (1 < n); mask++) { // 0에서 2^n - 1까지의 모든 숫자를 반복합니다. 여기서 각 숫자는 비트 마스크에 해당합니다. // 현재 숫자 마스크는 i번째 비트가 i번째 개체의 상태를 지정하는 비트 마스크입니다. for (int i = 0; i < n; i++) { // 각 개체의 상태를 이해하기 위해 n 비트를 반복합니다. if ((1 << i) & mask) { // i번째 비트가 1인지 확인 // i번째 객체가 상태 '1'인 옵션을 처리합니다. } else { // i번째 비트가 0인 경우 // 상태 '0'의 i번째 객체를 선택하는 옵션을 처리합니다. } } }
이 코드는 O(2^n * f(n))에서 실행됩니다. 여기서 f(n)은 하나의 특정 반복 가능 항목을 처리하는 데 걸리는 시간입니다.

Problem

Eric은 할아버지의 오래된 차고에서 LED 보드를 발견했습니다. 그러나 그는 활성화되었을 때 다이오드가 서로 동기화되지 않은 것에 놀랐습니다. 즉, 일부는 타버렸고 일부는 타지 않았습니다.
보드 자체는 특이한 것으로 판명되었습니다. 이것은 n개의 행과 m개의 열이 있는 직사각형 그리드이며 각 셀에는 하나의 다이오드가 있습니다. 각 행 근처에는 이 행의 모든 ​​다이오드를 전환하는 레버가 있습니다(불타는 다이오드는 꺼지고 그 반대도 마찬가지임). 각 열에는 동일한 레버가 있습니다(해당 열의 다이오드 사용).
Eric은 레버를 전환하여 다이오드를 동일한 상태로 전환할 수 있는지 궁금했습니다.

입력:
첫 번째 줄에는 두 개의 자연수 n과 m(1 <= n, m <= 7)이 포함되어 있습니다. 각각 보드의 행과 열의 수입니다.
그런 다음 각각 m개의 숫자가 있는 n개의 라인이 있습니다. 다이오드의 상태입니다. 여기서 0은 다이오드가 꺼져 있음을 의미하고 1은 켜져 있음을 의미합니다.

출력:
다이오드를 하나의 상태로 만드는 것이 가능하면 "YES"를 인쇄하고 불가능하면 "NO"를 인쇄하십시오.

예:
  <몸>
설명:
첫 번째 예에서 첫 번째 행의 모든 ​​다이오드를 전환한 다음 첫 번째 열의 모든 다이오드를 전환할 수 있습니다. 그러면 모든 다이오드가 꺼집니다.
 
입력 출력
2 2
0 1
10
2 2
0 1
0 0
아니오