// compiler avec -lfmt #include #include #include #include #include #include #include #include #include using namespace std; // variable globale pour stocker toutes les lignes valides set> sols; // une ligne est valide si : // - autant de 0 que de 1 // - pas plus que deux 0 ou deux 1 consécutifs bool estValide(const vector &sol) { if(count(sol.begin(), sol.end(), '0') != count(sol.begin(), sol.end(), '1')) return false; string ligne(sol.begin(), sol.end()); if(ligne.find("000") != string::npos || ligne.find("111") != string::npos) return false; return true; } // estValide() // Génère des lignes valides void genere(vector &lig, const int k, const int n) { if(k == n) // ligne complète { if(estValide(lig)) // Il faut vérifier la validité de la solution sols.insert(lig); return; } // k <= n - 1 : ligne incomplète if(lig[k] != '_') // bit fixe : on passe directement au rang récursif k + 1 { genere(lig, k + 1, n); } else // on a le choix de placer '0' ou '1' *si possible* { for(char bit = '0'; bit <= '1'; bit++) { if(k >= 2 && lig[k - 2] == bit && lig[k - 1] == bit) // pas possible continue; lig[k] = bit; genere(lig, k + 1, n); lig[k] = '_'; // backtrack (on remet '_' au rang k) } } } // genere() int main() { int n = 0; // longueur d'une ligne cin >> n; auto ligne = vector(n, 0); for(int k = 0; k < n; k++) cin >> ligne[k]; genere(ligne, 0, n); if(sols.empty()) { cout << "Aucune solution\n"; return 0; } cout << sols.size() << " solutions :\n"; for(auto &sol: sols) // vector { for(int k = 0; k < n; k++) { if(ligne[k] == '_') fmt::print(fg(fmt::color::light_blue), "{:1} ", sol[k]); else fmt::print(fg(fmt::color::light_pink), "{:1} ", sol[k]); } cout << '\n'; } return 0; } // main()