Euler_61.cpp (1860B)
1 #include <numeric> 2 3 #include "Euler.h" 4 5 bool match(int a, int b) 6 { 7 std::vector<int> digits_a = EulerUtility::intToDigits(a); 8 std::vector<int> digits_b = EulerUtility::intToDigits(b); 9 10 return (digits_a[2] == digits_b[0] && digits_a[3] == digits_b[1]); 11 } 12 13 int recurseFigurates(std::vector<int> cycle, std::vector<std::vector<int>> &figurates, std::vector<int> indices, int index) 14 { 15 for (int swap_index = index + 1; swap_index < 7; ++swap_index) 16 { 17 for (int i : figurates[indices[index]]) 18 { 19 if (match(cycle[cycle.size() - 1], i)) 20 { 21 cycle.push_back(i); 22 23 int answer = ((cycle.size() == 6) && (match(cycle[cycle.size() - 1], cycle[0]))) ? 24 std::accumulate(cycle.begin(), cycle.end(), 0) : ((cycle.size() == 6) || (index >= 5)) ? 0 : 25 recurseFigurates(cycle, figurates, indices, index + 1); 26 27 if (answer != 0) 28 { 29 return answer; 30 } 31 32 cycle.pop_back(); 33 } 34 } 35 36 if (swap_index < 6) 37 { 38 int temp = indices[swap_index]; 39 indices.erase(indices.begin() + swap_index); 40 indices.insert(indices.begin() + index, temp); 41 } 42 } 43 44 return 0; 45 } 46 47 int Euler::CyclicFigurateNumbers() 48 { 49 std::vector<std::vector<int>> figurates; 50 std::vector<int> indices; 51 std::vector<int> cycle; 52 53 for (int i = 0; i < 6; ++i) 54 { 55 indices.push_back(i); 56 figurates.push_back(EulerUtility::getFigurates(i + 3, 1000, 10000)); 57 } 58 59 for (int i : figurates[0]) 60 { 61 cycle.push_back(i); 62 63 int answer = recurseFigurates(cycle, figurates, indices, 1); 64 65 if (answer != 0) 66 { 67 return answer; 68 } 69 70 cycle.pop_back(); 71 } 72 73 return 0; 74 }