RosettaCodeData/Task/Pancake-numbers/C++/pancake-numbers.cpp

52 lines
1.6 KiB
C++
Raw Permalink Normal View History

2023-07-01 11:58:00 -04:00
#include <algorithm>
2025-02-27 18:35:13 -05:00
#include <cstdint>
#include <iomanip>
#include <iostream>
2023-07-01 11:58:00 -04:00
#include <map>
#include <numeric>
2025-02-27 18:35:13 -05:00
#include <queue>
#include <vector>
2023-07-01 11:58:00 -04:00
2025-02-27 18:35:13 -05:00
std::vector<uint32_t> flip_stack(std::vector<uint32_t> stack, const uint32_t& index) {
std::reverse(stack.begin(), stack.begin() + index);
2023-07-01 11:58:00 -04:00
return stack;
}
2025-02-27 18:35:13 -05:00
std::pair<std::vector<uint32_t>, uint32_t> pancake(const uint32_t& number) {
std::vector<uint32_t> initial_stack(number);
2023-07-01 11:58:00 -04:00
std::iota(initial_stack.begin(), initial_stack.end(), 1);
2025-02-27 18:35:13 -05:00
std::map<std::vector<uint32_t>, uint32_t> stack_flips = { std::make_pair(initial_stack, 0) };
std::queue<std::vector<uint32_t>> queue;
2023-07-01 11:58:00 -04:00
queue.push(initial_stack);
while ( ! queue.empty() ) {
2025-02-27 18:35:13 -05:00
std::vector<uint32_t> stack = queue.front();
2023-07-01 11:58:00 -04:00
queue.pop();
2025-02-27 18:35:13 -05:00
const uint32_t flips = stack_flips[stack] + 1;
for ( uint32_t i = 2; i <= number; ++i ) {
std::vector<uint32_t> flipped = flip_stack(stack, i);
if ( ! stack_flips.contains(flipped) ) {
2023-07-01 11:58:00 -04:00
stack_flips[flipped] = flips;
queue.push(flipped);
}
}
}
2025-02-27 18:35:13 -05:00
const auto ptr = std::max_element(stack_flips.begin(), stack_flips.end(),
[](const auto& pair1, const auto& pair2){ return pair1.second < pair2.second; });
2023-07-01 11:58:00 -04:00
return std::make_pair(ptr->first, ptr->second);
}
int main() {
2025-02-27 18:35:13 -05:00
for ( uint32_t n = 1; n <= 9; ++n ) {
std::pair<std::vector<uint32_t>, uint32_t> result = pancake(n);
2023-07-01 11:58:00 -04:00
std::cout << "pancake(" << n << ") = " << std::setw(2) << result.second << ". Example [";
2025-02-27 18:35:13 -05:00
for ( uint32_t i = 0; i < result.first.size() - 1; ++i ) {
2023-07-01 11:58:00 -04:00
std::cout << result.first[i] << ", ";
}
std::cout << result.first.back() << "]" << std::endl;
}
}