#include #include #include using namespace std; int N; map numbersConfigs; int* occurences; int* computeNumberConfig(int nr) { int* currentConfig = new int[N]; for (int i = 0; i < N; i++) { currentConfig[i] = 0; } int counter = N - 1; while (nr > 0) { currentConfig[counter] = nr % 2;; nr /= 2; counter--; } return currentConfig; } bool isSafe(int** configs, int nr, int pos) { if (pos == 0) return true; if (occurences[nr] == 1) return false; int* currentConfig = numbersConfigs.find(nr)->second; int differencesCounter = 0; for (int i = 0; i < N; i++) { if (configs[pos-1][i] != currentConfig[i]) differencesCounter++; if (differencesCounter > 1) return false; } return differencesCounter == 0 ? false : true; } bool solve(int** configs, int configsCount, int pos) { if (pos >= configsCount) return true; for (int i = 0; i < configsCount; i++) { if (isSafe(configs, i, pos)) { occurences[i] = 1; int* computedConfig = numbersConfigs.find(i)->second; for (int j = 0; j < N; j++) { configs[pos][j] = computedConfig[j]; } if (solve(configs, configsCount, pos + 1)) return true; occurences[i] = 0; for (int j = 0; j < N; j++) { configs[pos][j] = 0; } } } return false; } int main() { cin >> N; if (N < 1 || N > 12) return 0; int configsCount = (int)pow(2, N); int** configs = new int* [configsCount]; occurences = new int[configsCount]; for (int i = 0; i < configsCount; i++) { int* currentConfig = computeNumberConfig(i); occurences[i] = 0; numbersConfigs[i] = new int[N]; configs[i] = new int[N]; for (int j = 0; j < N; j++) { configs[i][j] = 0; numbersConfigs[i][j] = currentConfig[j]; } } if (solve(configs, configsCount, 0) == true) { for (int i = 0; i < configsCount; i++) { for (int j = 0; j < N; j++) { cout << configs[i][j]; } cout << endl; } } return 0; }