bool CheckMatrix(Terms const *matrix) { bool b = true; for (size_t i = 0; b && i < sizeof(ColConds) / sizeof(*ColConds); i++) { bool c = false; for (size_t j = 0; !c && j < rowLen; j++) { c = c || ColConds[i](j); } b = b && c; } progress++; if ((progress & (1024 * 1024 - 1)) == 0) { printf("%I64u\n", progress); } return b; }
std::function<bool(size_t)> ColConds[] = { [](size_t column) {return matrix[0 + 1 * rowLen] == DRIVER; }, [](size_t column) {return matrix[2 + 3 * rowLen] == NO; }, [](size_t column) {return matrix[column + 0 * rowLen] == TRI && matrix[column + rowLen * 3] == TABLET; }, [](size_t column) {return matrix[column + 2 * rowLen] == SMART && matrix[column + rowLen * 4] == SNAKE; }, [](size_t column) {return matrix[column + 1 * rowLen] == MANAGER && matrix[column + rowLen * 0] == ODIN; }, [](size_t column) {return matrix[column + 1 * rowLen] == ADVOKAT && matrix[column + rowLen * 2] == TV; }, [](size_t column) {return matrix[column + 0 * rowLen] == STUDIO && matrix[column + rowLen * 2] == EBOOK; }, [](size_t column) {return (matrix[column + 2 * rowLen] == COFFEE && matrix[column + 1 + rowLen * 4] == CAT) || (matrix[column + 2 * rowLen] == COFFEE && matrix[column - 1 + rowLen * 4] == CAT); }, [](size_t column) {return (matrix[column + 1 + 2 * rowLen] == EBOOK && matrix[column + rowLen * 4] == DOG) || (matrix[column - 1 + 2 * rowLen] == EBOOK && matrix[column + rowLen * 4] == DOG); }, [](size_t column) {return matrix[column + 1 * rowLen] == SYSADM && matrix[column + rowLen * 3] == PC; }, [](size_t column) {return matrix[column + 1 * rowLen] == BUILDER && matrix[column + rowLen * 4] == FISH; }, [](size_t column) {return matrix[column + 2 * rowLen] == MULTI && matrix[column + rowLen * 3] == MONO; }, [](size_t column) {return (matrix[column + 1 + 1 * rowLen] == DRIVER && matrix[column + rowLen * 0] == DVA) || (matrix[column - 1 + 1 * rowLen] == DRIVER && matrix[column + rowLen * 0] == DVA); }, [](size_t column) {return matrix[column + 1 + 0 * rowLen] == TRI && matrix[column + rowLen * 0] == CHETIRE; } };
// EinstainTask.cpp : Defines the entry point for the console application. #include "stdafx.h" #include <functional> //total task complexity: 24 883 200 000 variants = 120^5 namespace { enum Terms { STUDIO , ODIN , DVA , TRI , CHETIRE, DRIVER , ADVOKAT , MANAGER, BUILDER, SYSADM, MULTI , SMART , EBOOK , COFFEE , TV , PC , MONO , TABLET , NO , NOTEBOOK, CAT , DOG , SNAKE , FISH , HOMA }; TCHAR const * textDB[] = { _T("") , _T("") , _T("") , _T("") , _T(""), _T("") , _T("") , _T(""), _T("") , _T(""), _T(""), _T(""), _T("") , _T(""), _T(""), _T("") , _T(""), _T(""), _T("") , _T(""), _T("") , _T("") , _T("") , _T("") , _T(""), }; Terms matrix[sizeof(textDB) / sizeof(*textDB)]; const size_t rowLen = 5; unsigned long long progress = 0; std::function<bool(size_t)> ColConds[] = { [](size_t column) {return matrix[0 + 1 * rowLen] == DRIVER; }, [](size_t column) {return matrix[2 + 3 * rowLen] == NO; }, [](size_t column) {return matrix[column + 0 * rowLen] == TRI && matrix[column + rowLen * 3] == TABLET; }, [](size_t column) {return matrix[column + 2 * rowLen] == SMART && matrix[column + rowLen * 4] == SNAKE; }, [](size_t column) {return matrix[column + 1 * rowLen] == MANAGER && matrix[column + rowLen * 0] == ODIN; }, [](size_t column) {return matrix[column + 1 * rowLen] == ADVOKAT && matrix[column + rowLen * 2] == TV; }, [](size_t column) {return matrix[column + 0 * rowLen] == STUDIO && matrix[column + rowLen * 2] == EBOOK; }, [](size_t column) {return (matrix[column + 2 * rowLen] == COFFEE && matrix[column + 1 + rowLen * 4] == CAT) || (matrix[column + 2 * rowLen] == COFFEE && matrix[column - 1 + rowLen * 4] == CAT); }, [](size_t column) {return (matrix[column + 1 + 2 * rowLen] == EBOOK && matrix[column + rowLen * 4] == DOG) || (matrix[column - 1 + 2 * rowLen] == EBOOK && matrix[column + rowLen * 4] == DOG); }, [](size_t column) {return matrix[column + 1 * rowLen] == SYSADM && matrix[column + rowLen * 3] == PC; }, [](size_t column) {return matrix[column + 1 * rowLen] == BUILDER && matrix[column + rowLen * 4] == FISH; }, [](size_t column) {return matrix[column + 2 * rowLen] == MULTI && matrix[column + rowLen * 3] == MONO; }, [](size_t column) {return (matrix[column + 1 + 1 * rowLen] == DRIVER && matrix[column + rowLen * 0] == DVA) || (matrix[column - 1 + 1 * rowLen] == DRIVER && matrix[column + rowLen * 0] == DVA); }, [](size_t column) {return matrix[column + 1 + 0 * rowLen] == TRI && matrix[column + rowLen * 0] == CHETIRE; } }; void print() { for (int i = 0; i < sizeof(textDB) / sizeof(*textDB); i++) { if (i % rowLen == 0) _tcprintf(_T("\n")); _tcprintf(_T("%10s\t"), textDB[matrix[i]]); } } bool CheckMatrix(Terms const *matrix) { bool b = true; for (size_t i = 0; b && i < sizeof(ColConds) / sizeof(*ColConds); i++) { bool c = false; for (size_t j = 0; !c && j < rowLen; j++) { c = c || ColConds[i](j); } b = b && c; } progress++; if ((progress & (1024 * 1024 - 1)) == 0) { printf("%I64u\n", progress); } return b; } template<typename T> bool permute(T *v, const size_t start, const size_t n, size_t row); bool CheckMatrix(Terms *matrix, size_t row) { size_t rowCount = 5; if (row == (rowCount - 1)) { return CheckMatrix(matrix); } else { return permute(matrix + (row + 1) * rowLen, 0, rowLen, row + 1); } } template<typename T> void swap(T *v, const size_t i, const size_t j) { T t(v[i]); v[i] = v[j]; v[j] = t; } template<typename T> void rotateLeft(T *v, const size_t start, const size_t n) { T tmp = v[start]; for (size_t i = start; i < n - 1; i++) { v[i] = v[i + 1]; } v[n - 1] = tmp; } // rotateLeft template<typename T> bool permute(T *v, const size_t start, const size_t n, size_t row) { if (CheckMatrix(matrix, row)) return true; if (start < n) { size_t i, j; for (i = n - 2; i >= start; i--) { for (j = i + 1; j < n; j++) { swap(v, i, j); if (permute(v, i + 1, n, row)) return true; } // for j rotateLeft(v, i, n); if (i == 0) break; } // for i } return false; } // permute }; int _tmain(int argc, _TCHAR* argv[]) { for (int i = 0; i < sizeof(textDB) / sizeof(*textDB); i++) { matrix[i] = (Terms)i; } if (permute(matrix, 0, rowLen, 0)) { print(); } return 0; }
Source: https://habr.com/ru/post/368697/
All Articles