diff --git a/.vscode/settings.json b/.vscode/settings.json index 074c4ab03..ada3aa993 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -2,5 +2,63 @@ "C_Cpp.clang_format_style": "{ BasedOnStyle: Google, UseTab: Never, IndentWidth: 4, TabWidth: 4, AllowShortIfStatementsOnASingleLine: false, IndentCaseLabels: true, ColumnLimit: 80, AccessModifierOffset: -3, AlignConsecutiveMacros: true }", "editor.formatOnSave": true, "editor.formatOnType": true, - "editor.formatOnPaste": true + "editor.formatOnPaste": true, + "files.associations": { + "cctype": "cpp", + "clocale": "cpp", + "cmath": "cpp", + "cstdarg": "cpp", + "cstddef": "cpp", + "cstdio": "cpp", + "cstdlib": "cpp", + "cstring": "cpp", + "ctime": "cpp", + "cwchar": "cpp", + "cwctype": "cpp", + "array": "cpp", + "atomic": "cpp", + "*.tcc": "cpp", + "bitset": "cpp", + "chrono": "cpp", + "cinttypes": "cpp", + "complex": "cpp", + "cstdint": "cpp", + "deque": "cpp", + "list": "cpp", + "unordered_map": "cpp", + "unordered_set": "cpp", + "vector": "cpp", + "exception": "cpp", + "algorithm": "cpp", + "functional": "cpp", + "iterator": "cpp", + "map": "cpp", + "memory": "cpp", + "memory_resource": "cpp", + "numeric": "cpp", + "optional": "cpp", + "random": "cpp", + "ratio": "cpp", + "set": "cpp", + "string": "cpp", + "string_view": "cpp", + "system_error": "cpp", + "tuple": "cpp", + "type_traits": "cpp", + "utility": "cpp", + "fstream": "cpp", + "initializer_list": "cpp", + "iomanip": "cpp", + "iosfwd": "cpp", + "iostream": "cpp", + "istream": "cpp", + "limits": "cpp", + "new": "cpp", + "ostream": "cpp", + "sstream": "cpp", + "stdexcept": "cpp", + "streambuf": "cpp", + "typeinfo": "cpp", + "valarray": "cpp" + } } diff --git a/backtracking/magic_sequence.cpp b/backtracking/magic_sequence.cpp index 5fef52386..c43ea37bf 100644 --- a/backtracking/magic_sequence.cpp +++ b/backtracking/magic_sequence.cpp @@ -15,41 +15,45 @@ namespace backtracking { namespace magic_sequence { - using sequence_t = std::vector; +using sequence_t = std::vector; - void print(const sequence_t& s) { - for(auto item : s) std::cout << item << " "; - std::cout << std::endl; +void print(const sequence_t& s) { + for (const auto& item : s) std::cout << item << " "; + std::cout << std::endl; +} + +// Check if it's a magic sequence +bool is_magic(const sequence_t& s) { + for (unsigned int i = 0; i < s.size(); i++) { + if (std::count(s.cbegin(), s.cend(), i) != s[i]) + return false; } + return true; +} - // Check if it's a magic sequence - bool is_magic(const sequence_t& s) { - for(unsigned int i = 0; i < s.size(); i++) - if(std::count(s.cbegin(), s.cend(), i) != s[i]) return false; - return true; - } +// Filtering of sub-solutions +// true if the sub-solution is valid otherwise false +bool filtering(const sequence_t& s, unsigned int depth) { + return std::accumulate(s.cbegin(), s.cbegin() + depth, + static_cast(0)) <= s.size(); +} - // Filtering of sub-solutions - // true if the sub-solution is valid otherwise false - bool filtering(const sequence_t& s, unsigned int depth) { - return std::accumulate(s.cbegin(), s.cbegin() + depth, static_cast(0)) <= - s.size(); - } - - void solve(sequence_t& s, std::list& ret, unsigned int depth = 0) { - if(depth == s.size()) { - if(is_magic(s)) ret.push_back(s); - } else { - for(unsigned int i = 0; i < s.size(); i++) { - s[depth] = i; - if(filtering(s, depth + 1)) solve(s, ret, depth + 1); - } +void solve(sequence_t* s, std::list* ret, unsigned int depth = 0) { + if (depth == s->size()) { + if (is_magic(*s)) + ret->push_back(*s); + } else { + for (unsigned int i = 0; i < s->size(); i++) { + (*s)[depth] = i; + if (filtering(*s, depth + 1)) + solve(s, ret, depth + 1); } } +} -} // namespace magic_sequence +} // namespace magic_sequence -} // namespace backtracking +} // namespace backtracking using namespace backtracking::magic_sequence; @@ -64,11 +68,11 @@ static void test() { int main() { test(); - for(unsigned int i = 2; i < 12; i++) { + for (unsigned int i = 2; i < 12; i++) { std::cout << "Solution for n = " << i << std::endl; - std::list r1; - sequence_t s1(i, i); + std::list* r1 = new std::list(); + sequence_t* s1 = new sequence_t(i, i); solve(s1, r1); - for(auto item : r1) print(item); + for (const auto& item : *r1) print(item); } }