Module: 指定されたマスクのすべてのサブパターンを反復します


Problem

5 /7


エリックとLEDボード

Theory Click to read/hide

特定の長さのすべてのビットシーケンスを列挙する必要がある場合があります。言い換えれば、可能なすべてのオプションを反復処理し、各オブジェクトに対して 2 つの可能な状態のいずれかが選択されます。

このような状況では、ビット マスクを使用して列挙を実装することが可能です。このアプローチの利点は、そのようなコードが非再帰的に機能し、コレクションなどではなく数値を操作することで、パフォーマンスが大幅に向上することです。

ビットマスクを使用した一般的なコードを以下に示します。 intn; // oobjects の数 (ビット シーケンスの長さ) 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' の i 番目のオブジェクトであるオプションを処理します。 } } }
このコードは O(2^n * f(n)) で実行されます。ここで、f(n) は 1 つの特定の iterable を処理するのにかかる時間です。

Problem

エリックは祖父の古いガレージで LED ボードを見つけました。しかし、彼は、活性化されたときにダイオードが互いに同期していないことに驚いた。つまり、燃えたものもあれば、燃えなかったものもありました。
ボード自体が異常であることが判明しました。これは n 行 m 列の長方形のグリッドで、各セルには 1 つのダイオードが含まれています。各列の近くには、この列のすべてのダイオードを切り替えるレバーがあります (燃えているダイオードは消え、その逆も同様です)。各列には同じレバーがあります (対応する列のダイオードを使用します)。
エリックは、レバーを切り替えることでダイオードを同じ状態に切り替えることができるかどうか疑問に思いました.

入力:
最初の行には、2 つの自然数 n と m (1 <= n、m <= 7) が含まれています。それぞれ、ボード上の行と列の数です。
次に、それぞれ m の数字を持つ n 行があります。ダイオードの状態です。0 はダイオードがオフであることを意味し、1 はダイオードがオンであることを意味します。

出力:
ダイオードを 1 つの状態にすることができる場合は「YES」、不可能な場合は「NO」と出力してください。

例:
  <本体>
説明:
最初の例では、最初の行のすべてのダイオードを切り替えてから、最初の列のすべてのダイオードを切り替えることができます。その後、すべてのダイオードがオフになります。
 
入力 出力
2 2
0 1
10
はい
2 2
0 1
0 0
いいえ