Module: Itérer sur tous les sous-modèles d'un masque donné


Problem

5 /7


Eric et la carte LED

Theory Click to read/hide

Il arrive qu'il soit nécessaire d'énumérer toutes les séquences de bits d'une certaine longueur. Ou en d'autres termes, itérer sur toutes les options possibles, où pour chaque objet l'un des deux états possibles est sélectionné.

Dans de telles situations, il est possible de mettre en œuvre une énumération à l'aide de masques de bits. L'avantage de cette approche est qu'un tel code fonctionne de manière non récursive et opère sur des nombres au lieu de collections ou similaires, ce qui améliore considérablement les performances.

Le code général utilisant des masques de bits est donné ci-dessous : international ; // nombre d'oobjects (longueur de la séquence de bits) for (int mask = 0; mask < (1 << n); mask++) { // boucle sur tous les nombres de 0 à 2^n - 1, où chaque nombre correspond à un masque de bits // le masque de nombre actuel est un masque de bits, où le ième bit spécifie l'état du ième objet for (int i = 0; i < n; i++) { // itération sur n bits pour comprendre l'état de chaque objet if ((1 << i) & mask) { // vérifie si le i-ème bit est égal à un // traite l'option selon laquelle le i-ème objet a l'état '1' } else { // cas où le i-ième bit est zéro // traite l'option que le i-ème objet de l'état '0' } } }
Ce code s'exécute en O(2^n * f(n)), où f(n) est le temps qu'il vous faut pour traiter un itérable particulier.

Problem

Eric a trouvé une carte LED dans l'ancien garage de son grand-père. Cependant, il a été surpris que lorsqu'elles étaient activées, les diodes n'étaient pas synchronisées les unes avec les autres. C'est-à-dire que certains d'entre eux ont brûlé et d'autres non.
Le conseil lui-même s'est avéré inhabituel. C'est une grille rectangulaire à n lignes et m colonnes, où chaque cellule contient une diode. Près de chaque rangée, il y a un levier qui commute toutes les diodes de cette rangée (les diodes allumées s'éteignent et vice versa). Chaque colonne a les mêmes leviers (dont j'utilise les diodes dans la colonne correspondante).
Eric s'est demandé s'il était possible de mettre les diodes dans le même état en basculant les leviers.

Saisie :
La première ligne contient deux nombres naturels n et m (1 <= n, m <= 7) - le nombre de lignes et de colonnes sur le tableau, respectivement.
Ensuite, il y a n lignes avec m numéros chacune - les états des diodes, où 0 signifie que la diode est éteinte et 1 qu'elle est allumée.

Sortie :
Imprimez "OUI" s'il est possible de mettre les diodes dans un état et "NON" si c'est impossible.

Exemples :
 
Entrée Sortie
2 2
0 1
10
OUI
2 2
0 1
0 0
NON

Explication :
Dans le premier exemple, vous pouvez commuter toutes les diodes de la première rangée, puis commuter toutes les diodes de la première colonne. Ensuite, toutes les diodes seront éteintes.